diff --git a/mensa_app/forms.py b/mensa_app/forms.py index d9bcac4..25ced1f 100644 --- a/mensa_app/forms.py +++ b/mensa_app/forms.py @@ -18,7 +18,6 @@ class GerichtForm(forms.ModelForm): 'ist_allergene_frei', 'allergene', 'beschreibung', # Neues Feld für Zutaten/Rohstoffe - 'bilder', # Das Bild-Feld 'ist_dauerangebot' ] diff --git a/mensa_app/templates/mensa_app/add_gericht.html b/mensa_app/templates/mensa_app/add_gericht.html index f89c48e..b43fc98 100644 --- a/mensa_app/templates/mensa_app/add_gericht.html +++ b/mensa_app/templates/mensa_app/add_gericht.html @@ -1,32 +1,120 @@ - + + Neues Gericht hinzufügen + + + - -
-

Neue Speiseart hinzufügen

- {# !!! KRITISCH WICHTIG: enctype muss für Dateiuploads stehen !!! #} -
- {% csrf_token %} + +
+ +
+

🥗 Neues Gericht Speiseplan hinzufügen

+

Bitte fülle alle notwendigen Felder aus, um das Gericht zu veröffentlichen.

+
- - {# Man kann die komplexe Struktur durch eine einfache Schleife ersetzen #} - {% for field in form %} -
- - {{ field }} + +
+ {# ⚠️ Wichtig: enctype bleibt erhalten! #} + + {% csrf_token %} - - {% if field.errors %} -

{{ field.errors }}

- {% endif %} + +
+
Grunddaten & Identifikation
+
+ + +
+ {{ form.name }} + {% if form.name.errors %}

{{ form.name.errors }}

{% endif %} +
+ + +
+ {{ form.kategorie }} + {% if form.kategorie.errors %}

{{ form.kategorie.errors }}

{% endif %} +
+ + +
+ {{ form.preis }} + {% if form.preis.errors %}

{{ form.preis.errors }}

{% endif %} +
+ +
- {% endfor %} - - + + +
+
Details und Statusprüfung
+
+ + +
+ {% if form.ist_vegetarisch %} + {{ form.ist_vegetarisch }} + {% endif %} +
+ +
+ {% if form.ist_allergene_frei %} + {{ form.ist_allergene_frei }} + {% endif %} +
+ + +
+ {{ form.ist_dauerangebot }} + +
+ +
+
+ + +
+
+
Beschreibung & Nährstoffe
+ + +
+ {{ form.allergene }} + {% if form.allergene.errors %}

{{ form.allergene.errors }}

{% endif %} +
+ + +
+ {{ form.beschreibung }} + {% if form.beschreibung.errors %}

{{ form.beschreibung.errors }}

{% endif %} +
+
+
+ + + +
+
Mediendateien hochladen
+
+
+ {{ form.bilder }} + {% if form.bilder.errors %}

{{ form.bilder.errors }}

{% endif %} +
+
+
+ + + +
+ +
+ + +
diff --git a/mensa_app/urls.py b/mensa_app/urls.py index 49ea019..6e09e5c 100644 --- a/mensa_app/urls.py +++ b/mensa_app/urls.py @@ -2,6 +2,7 @@ from django.urls import path from .views import GerichtListView from .views import SpeiseplanView # Achte auf den neuen Klassennamen! from .views import BestellSummaryView +from .views import GerichtCreateView urlpatterns = [ path('speisekarte/', GerichtListView.as_view(), name='speisekarte'), diff --git a/mensa_app/views.py b/mensa_app/views.py index f5b1658..e852d41 100644 --- a/mensa_app/views.py +++ b/mensa_app/views.py @@ -111,18 +111,38 @@ class GerichtCreateView(CreateView): objekt = self.object # Gibt uns das gerade gespeicherte Objekt zurück return reverse('speisekarte') + # 🔑 DIES ist die entscheidende Methode! def form_valid(self, form): """ - Übersteuert die Standard-Logik: - 1. Speichert zuerst das Gericht (über super()). - 2. Leitet danach auf ein success/confirmation Pattern um. + Wird ausgeführt, wenn das Formular erfolgreich validiert wurde. + Wir speichern zuerst das Gericht (Parent) und dann alle Bilder (Children). """ - super().form_valid() # Das eigentliche Speichern des Objekts + # 1. Super-Call: Speichere das Hauptobjekt (das Gericht) ZUERST! + # Dadurch wird der 'gericht_pk' generiert, den wir für die Kinder brauchen. + gericht_instance = super().form_valid() - # Hier ist der Haken an Django: Die View wird beim Erfolg automatisch weitergeleitet. - # Wir verwenden einen kleinen Trick, damit wir den Namen im Kontext haben. + # Das gerade erstellte Gericht ist nun gespeichert und hat einen primären Key (PK). + newly_created_dish = self.object - return redirect('success_nach_gerichterstellung') # Leiten auf eine temporäre URL um + # 2. Bildverarbeitung: Gehe alle Dateien im POST-Request durch + uploaded_files = self.request.FILES.getlist('bilder') # HIER das Feld 'bilder' verwenden! + + if uploaded_files: + print(f"DEBUG: Es wurden {len(uploaded_files)} Bilder verarbeitet.") + for file in uploaded_files: + # 3. Für jedes Bild erstellen wir ein neues GerichtBild-Objekt (Child) + try: + GerichtBild.objects.create( + gericht=newly_created_dish, # Verknüpfung zum Parent + image=file, # Das hochgeladene File-Objekt + sort_order=0 # Standardmäßig in die Queue + ) + except Exception as e: + print(f"WARNUNG beim Speichern des Bildes {file.name}: {e}") + + + # 4. Die View wird automatisch weitergeleitet, dank super().form_valid() + return redirect('speisekarte') # Name der URL nach Erfolg # Optional: Setzen des initialen Datenzustands (z.B. Datum, falls relevant) def get_context_data(self, **kwargs):