/ / Django-Formularfelder abhängig von Parametern mit Crispy Forms - Django, Django-Formen, Django-Crispy-Formen

Django-Formularfelder je nach Parameter mit Crispy Forms - Django, Django-Formen, Django-Crispy-Formen

Ich versuche eine Django-Form (mit Crispy) zu habenForm Rendering), wobei die angezeigten Formularfelder von einem Parameter abhängen, der von der Ansicht an das Formular übergeben Ich glaube, dass der Parameter korrekt weitergegeben wird, aber trotzdem werden alle Formularfelder angezeigt.

Das Modell "IndividualFeedback" enthält FelderDieses kann für eine Vielzahl verschiedener Beurteilungstypen verwendet werden und verfügt über 8 Felder für Feedbackkategorien. Wie viele davon angezeigt werden, sollte von dem in den Ansichten angegebenen Beurteilungstyp abhängen. Ich möchte, dass der Bewertungstyp "ESSAY" 4 dieser Kategorienfelder und der Typ "PRESENTATION" 3 anzeigt. Derzeit bekomme ich alle 8, egal was ich weitergebe.

Hier ist meine forms.py:

class IndividualFeedbackForm(forms.ModelForm):

mark = forms.IntegerField() # One additional field that"s not in the model
helper = FormHelper()

def __init__(self, *args, **kwargs):
marksheet_type = kwargs.pop("marksheet_type")
super(IndividualFeedbackForm, self).__init__(*args, **kwargs)

helper = FormHelper()
if marksheet_type == "ESSAY":
print("Detects marksheet") # Just for testing - and it does...
helper.layout = Layout(
"marker",
"marking_date",
"submission_date",
Field("category_mark_1", label=CATEGORIES["ESSAY"]["i-1"]),
Field("category_mark_2", label=CATEGORIES["ESSAY"]["i-2"]),
Field("category_mark_3", label=CATEGORIES["ESSAY"]["i-3"]),
Field("category_mark_4", label=CATEGORIES["ESSAY"]["i-4"]),
"comments",
"mark"
)
elif marksheet_type == "PRESENTATION":
...

class Meta:
model = IndividualFeedback
fields = [
"marker",
"marking_date",
"submission_date",
"comments",
"category_mark_1",
"category_mark_2",
"category_mark_3",
"category_mark_4",
"category_mark_5",
"category_mark_6",
"category_mark_7",
"category_mark_8",
]

Der Code in der Datei views.py ist recht einfach und gibt offensichtlich den richtigen Parameter weiter - wie in der Zeile "Drucken" dargestellt.

Wie kann ich das zur Arbeit bringen?

Und als zweite Frage: genügt es zu Testzwecken, einfach "assertContains" in form_as_p () zu testen, oder brauche ich etwas anderes wegen Crispy Forms?

Antworten:

0 für die Antwort № 1

Sie erstellen eine Variable mit dem Namen "Helper", ordnen diese jedoch nicht der Formularinstanz zu. Sie müssen self.helper = FormHelper verwenden:

def __init__(self, *args, **kwargs):
marksheet_type = kwargs.pop("marksheet_type")
super(IndividualFeedbackForm, self).__init__(*args, **kwargs)

self.helper = FormHelper()
if marksheet_type == "ESSAY":
print("Detects marksheet") # Just for testing - and it does...
self.helper.layout = Layout(
"marker",
"marking_date",
"submission_date",
Field("category_mark_1", label=CATEGORIES["ESSAY"]["i-1"]),
Field("category_mark_2", label=CATEGORIES["ESSAY"]["i-2"]),
Field("category_mark_3", label=CATEGORIES["ESSAY"]["i-3"]),
Field("category_mark_4", label=CATEGORIES["ESSAY"]["i-4"]),
"comments",
"mark"
)
elif marksheet_type == "PRESENTATION":
...

Siehe Beispiel http://django-crispy-forms.readthedocs.org/en/latest/form_helper.html#formhelper-with-a-form-attached-default-layout .

Sie können auch FormHelper () aus der Klassendefinition oben entfernen.

Beachten Sie schließlich, dass bei knackigen Formularen automatisch alle Felder angefügt werden, die in der Meta-Klasse des Formats definiert sind, die nicht im Layout vorhanden ist. Sehen Quelle.