Ich habe ein Modell:
from django.db import models
CHOICES = (
('s', 'Glorious spam'),
('e', 'Fabulous eggs'),
)
class MealOrder(models.Model):
meal = models.CharField(max_length=8, choices=CHOICES)
Ich habe ein Formular:
from django.forms import ModelForm
class MealOrderForm(ModelForm):
class Meta:
model = MealOrder
Und ich möchte formtools.preview verwenden. Die Standardvorlage druckt die Kurzversion der Auswahl ('e' anstelle von 'Fabulous Eggs'), da sie verwendet wird
{% for field in form %}
<tr>
<th>{{ field.label }}:</th>
<td>{{ field.data }}</td>
</tr>
{% endfor %}.
Ich hätte gerne eine Vorlage, die so allgemein ist wie die erwähnte, aber stattdessen 'Fabulous Eggs' druckt.
[Da ich Zweifel hatte, wo die eigentliche Frage ist, habe ich sie für uns alle kühn gemacht :)]
Ich weiß, wie man die ausführliche Version einer Wahl auf eine Weise erhält, die selbst hässlich ist:
{{ form.meal.field.choices.1.1 }}
Der wahre Schmerz ist, dass ich die ausgewählte Wahl treffen muss, und der einzige Weg, der mir in den Sinn kommt, besteht darin, durch Entscheidungen und Überprüfungen zu iterieren {% ifequals currentChoice.0 choiceField.data %}
, was noch hässlicher ist.
Kann es leicht gemacht werden? Oder braucht es eine Template-Tag-Programmierung? Sollte das nicht schon in Django verfügbar sein?
quelle
Die beste Lösung für Ihr Problem ist die Verwendung von Hilfsfunktionen. Wenn die Auswahlmöglichkeiten in der Variablen CHOICES gespeichert sind und das Modellfeld, in dem die ausgewählte Auswahl gespeichert ist, " Auswahlmöglichkeiten " lautet, können Sie sie direkt verwenden
in Ihrer Vorlage. Hier ist x die Modellinstanz. Ich hoffe es hilft.
quelle
Ich entschuldige mich, wenn diese Antwort mit einer der oben aufgeführten überflüssig ist, aber es scheint, dass diese noch nicht angeboten wurde, und sie scheint ziemlich sauber zu sein. So habe ich das gelöst:
Meine Ansicht übergibt einen Scoop an die Vorlage (Hinweis: nicht Scoop.values ()), und die Vorlage enthält:
quelle
Basierend auf Noahs Antwort ist hier eine Version, die gegen Felder ohne Auswahlmöglichkeiten immun ist:
Ich bin mir nicht sicher, ob es in Ordnung ist, einen Filter für diesen Zweck zu verwenden. Wenn jemand eine bessere Lösung hat, werde ich mich freuen, sie zu sehen :) Danke Noah!
quelle
Wir können die Filterlösung von Noah erweitern , um universeller mit Daten und Feldtypen umzugehen:
Hier ist der Code:
quelle
Ich glaube nicht, dass es dafür einen eingebauten Weg gibt. Ein Filter könnte jedoch den Trick machen:
Dann können Sie tun:
quelle
Fügen Sie Ihren models.py eine einfache Funktion hinzu:
Jetzt können Sie einen ausführlichen Wert für Auswahlfelder wie folgt erhalten:
Upd.: Ich bin mir nicht sicher, ob diese Lösung "pythonic" und "django-way" genug ist oder nicht, aber sie funktioniert. :) :)
quelle
Sie haben Model.get_FOO_display (), wobei FOO der Name des Felds ist, für das Auswahlmöglichkeiten bestehen.
Führen Sie in Ihrer Vorlage Folgendes aus:
quelle