fix_Bilder

This commit is contained in:
ben8
2025-04-22 19:11:31 +02:00
parent 50cd95daf1
commit 95e4428943
8 changed files with 100 additions and 15 deletions

View File

@@ -1,5 +1,5 @@
from django.contrib import admin from django.contrib import admin
from .models import QivipQuiz, QivipQuestion, QivipQuizFavorite, QuizCategory from .models import QivipQuiz, QivipQuestion, QivipQuizFavorite, QuestionImage, QuizCategory, QuizImage
# Für das QivipQuiz Modell # Für das QivipQuiz Modell
class QivipQuizAdmin(admin.ModelAdmin): class QivipQuizAdmin(admin.ModelAdmin):
@@ -23,8 +23,17 @@ class QuizCategoryAdmin(admin.ModelAdmin):
class QivipQuizFavoriteAdmin(admin.ModelAdmin): class QivipQuizFavoriteAdmin(admin.ModelAdmin):
list_display = ('user', 'favorite', 'quiz') # Welche Felder sollen in der Übersicht angezeigt werden list_display = ('user', 'favorite', 'quiz') # Welche Felder sollen in der Übersicht angezeigt werden
class QuizImageAdmin(admin.ModelAdmin):
list_display = ('image',)
class QuestionImageAdmin(admin.ModelAdmin):
list_display = ('image',)
# Registrierung der Modelle im Admin # Registrierung der Modelle im Admin
admin.site.register(QivipQuiz, QivipQuizAdmin) admin.site.register(QivipQuiz, QivipQuizAdmin)
admin.site.register(QivipQuestion, QivipQuestionAdmin) admin.site.register(QivipQuestion, QivipQuestionAdmin)
admin.site.register(QuizCategory, QuizCategoryAdmin) admin.site.register(QuizCategory, QuizCategoryAdmin)
admin.site.register(QivipQuizFavorite, QivipQuizFavoriteAdmin) admin.site.register(QivipQuizFavorite, QivipQuizFavoriteAdmin)
admin.site.register(QuizImage, QuizImageAdmin)
admin.site.register(QuestionImage, QuestionImageAdmin)

View File

@@ -0,0 +1,38 @@
# Generated by Django 5.1.7 on 2025-04-22 16:04
import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('library', '0049_alter_qivipquestion_image'),
]
operations = [
migrations.CreateModel(
name='QuestionImage',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('image', models.ImageField(blank=True, null=True, upload_to='question_images/', verbose_name='Bild')),
],
),
migrations.CreateModel(
name='QuizImage',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('image', models.ImageField(blank=True, max_length=256, null=True, upload_to='quiz_images/', verbose_name='Bild')),
],
),
migrations.AlterField(
model_name='qivipquestion',
name='image',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='questions', to='library.questionimage'),
),
migrations.AlterField(
model_name='qivipquiz',
name='image',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='quizzes', to='library.QuizImage'),
),
]

View File

@@ -4,6 +4,15 @@ from django.utils.text import slugify
import uuid import uuid
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError
class QuizImage(models.Model):
image = models.ImageField(max_length=256,verbose_name="Bild", upload_to='quiz_images/', blank=True, null=True) # Bild speichern in media/quiz_images/
class QuestionImage(models.Model):
image = models.ImageField(verbose_name="Bild", upload_to="question_images/", blank=True, null=True)
class QivipQuiz(models.Model): class QivipQuiz(models.Model):
STATUS_VALUES = { STATUS_VALUES = {
"öffentlich": "Öffentlich", "öffentlich": "Öffentlich",
@@ -27,7 +36,15 @@ class QivipQuiz(models.Model):
if value.strip() == "In dem Quiz geht es um ...": if value.strip() == "In dem Quiz geht es um ...":
raise ValidationError("Bitte gib eine aussagekräftige Beschreibung ein.") raise ValidationError("Bitte gib eine aussagekräftige Beschreibung ein.")
image = models.ImageField(max_length=256,verbose_name="Bild", upload_to='quiz_images/', blank=True, null=True) # Bild speichern in media/quiz_images/ image = models.ForeignKey(
QuizImage,
null=True,
blank=True,
on_delete=models.SET_NULL, # Bild bleibt erhalten, selbst wenn das Quiz gelöscht wird
related_name="quizzes"
)
uuid = models.UUIDField(default=uuid.uuid4, editable=False, unique=True) uuid = models.UUIDField(default=uuid.uuid4, editable=False, unique=True)
user_id = models.ForeignKey(User, on_delete=models.CASCADE, related_name='quiz') user_id = models.ForeignKey(User, on_delete=models.CASCADE, related_name='quiz')
#creator = models.ForeignKey(User, on_delete=models.SET_NULL,blank=True, null=True, related_name='creator_quiz') #creator = models.ForeignKey(User, on_delete=models.SET_NULL,blank=True, null=True, related_name='creator_quiz')
@@ -74,7 +91,14 @@ class QivipQuestion(models.Model):
update_date = models.DateTimeField(auto_now=True) update_date = models.DateTimeField(auto_now=True)
data = models.TextField() data = models.TextField()
time_per_question = models.CharField(max_length=3, choices=list(TIME_VALUES.items()), default=30, help_text="Zeit pro Frage in Sekunden") time_per_question = models.CharField(max_length=3, choices=list(TIME_VALUES.items()), default=30, help_text="Zeit pro Frage in Sekunden")
image = models.ImageField(verbose_name="Bild", upload_to="question_images/", blank=True, null=True) image = models.ForeignKey(
QuestionImage,
null=True,
blank=True,
on_delete=models.SET_NULL,
related_name="questions"
)
def __str__(self): def __str__(self):
return self.data[:50] return self.data[:50]

View File

@@ -6,7 +6,7 @@ from django.contrib.auth.decorators import login_required
from django.contrib.auth.models import User from django.contrib.auth.models import User
from django.urls import reverse from django.urls import reverse
from django.contrib import messages from django.contrib import messages
from .models import QivipQuiz, QivipQuestion, QivipQuizFavorite from .models import QivipQuiz, QivipQuestion, QivipQuizFavorite, QuestionImage, QuizImage
from .forms import QuizForm, QuestionForm from .forms import QuizForm, QuestionForm
import json import json
from django.core.paginator import Paginator from django.core.paginator import Paginator
@@ -200,7 +200,11 @@ def new_quiz(request):
form = QuizForm(request.POST, request.FILES) form = QuizForm(request.POST, request.FILES)
if form.is_valid(): if form.is_valid():
quiz = form.save(commit=False) quiz = form.save(commit=False)
quiz.image = quiz_image
uploaded_file = request.FILES["quiz_image"]
quiz_img = QuizImage.objects.create(image=uploaded_file)
quiz.image = quiz_img
quiz.user_id = request.user quiz.user_id = request.user
#quiz.creator = request.user #quiz.creator = request.user
quiz.save() quiz.save()
@@ -219,8 +223,10 @@ def edit_quiz(request, pk):
form = QuizForm(request.POST, instance=quiz, files=request.FILES) form = QuizForm(request.POST, instance=quiz, files=request.FILES)
if form.is_valid(): if form.is_valid():
try: try:
quiz_image = request.FILES['quiz_image']
quiz.image=quiz_image uploaded_file = request.FILES["quiz_image"]
quiz_img = QuizImage.objects.create(image=uploaded_file)
quiz.image = quiz_img
quiz.save() quiz.save()
except Exception: except Exception:
pass pass
@@ -518,7 +524,15 @@ def edit_question(request, pk):
question.data = json.dumps(json_data) question.data = json.dumps(json_data)
question.time_per_question = request.POST.get('time_per_question', '30') question.time_per_question = request.POST.get('time_per_question', '30')
question.image = question_image try:
if question_image:
question_img = QuestionImage.objects.create(image=question_image) # Erstelle das QuestionImage-Objekt
question.image = question_img # Weise es dem Bildfeld zu
question.save()
except:
pass
question.save() question.save()
#return modified(request, question.quiz_id.pk) #return modified(request, question.quiz_id.pk)
return redirect('library:detail_quiz', pk=question.quiz_id.pk) return redirect('library:detail_quiz', pk=question.quiz_id.pk)

View File

@@ -6,7 +6,7 @@
{% csrf_token %} {% csrf_token %}
{{ form.as_p }} {{ form.as_p }}
{% if form.instance.image %} {% if form.instance.image %}
<img src="{{ form.instance.image.url }}" style="max-width: 100px;" alt="Bild der Frage"> <img src="{{ form.instance.image.image.url }}" style="max-width: 100px;" alt="Bild der Frage">
<label for="reset_image"> <label for="reset_image">
<input type="checkbox" name="reset_image" id="reset_image"> <input type="checkbox" name="reset_image" id="reset_image">
Bild zurücksetzen Bild zurücksetzen

View File

@@ -97,7 +97,7 @@
<div class="relative w-full h-full inset-0 bg-cover bg-center"> <div class="relative w-full h-full inset-0 bg-cover bg-center">
<!-- Hintergrundbild --> <!-- Hintergrundbild -->
<div class="absolute inset-0 bg-cover bg-center" <div class="absolute inset-0 bg-cover bg-center"
style="background-image: url({{ quiz.image.url }});"> style="background-image: url({{ quiz.image.image.url }});">
</div> </div>
</div> </div>
@@ -284,7 +284,7 @@
<div class="relative w-full h-full inset-0 bg-cover bg-center"> <div class="relative w-full h-full inset-0 bg-cover bg-center">
<!-- Hintergrundbild --> <!-- Hintergrundbild -->
<div class="absolute inset-0 bg-cover bg-center" <div class="absolute inset-0 bg-cover bg-center"
style="background-image: url({{ quiz.image.url }});"> style="background-image: url({{ quiz.image.image.url }});">
</div> </div>
</div> </div>
@@ -479,7 +479,7 @@
<div class="relative w-full h-full inset-0 bg-cover bg-center"> <div class="relative w-full h-full inset-0 bg-cover bg-center">
<!-- Hintergrundbild --> <!-- Hintergrundbild -->
<div class="absolute inset-0 bg-cover bg-center" <div class="absolute inset-0 bg-cover bg-center"
style="background-image: url({{ quiz.image.url }});"> style="background-image: url({{ quiz.image.image.url }});">
</div> </div>
</div> </div>

View File

@@ -23,9 +23,9 @@
</div> </div>
</div> </div>
{% if image %} {% if image %}
<img src="{{ image.url }}" style="max-width: 500px;" alt="Bild der Frage"> <img src="{{ image.image.url }}" style="max-width: 500px;" alt="Bild der Frage">
<label for="reset_image"> <label for="reset_image">
<input type="checkbox" name="reset_ques_image" id="reset_ques_image"> <input type="checkbox" name="reset_ques_image" id="reset_ques_image">
Bild zurücksetzen Bild zurücksetzen

View File

@@ -25,7 +25,7 @@
</div> </div>
{% if image %} {% if image %}
<img src="{{ image.url }}" style="max-width: 500px;" alt="Bild der Frage"> <img src="{{ image.image.url }}" style="max-width: 500px;" alt="Bild der Frage">
<label for="reset_image"> <label for="reset_image">
<input type="checkbox" name="reset_ques_image" id="reset_ques_image"> <input type="checkbox" name="reset_ques_image" id="reset_ques_image">
Bild zurücksetzen Bild zurücksetzen