Я пытаюсь иметь форму Django (используя рендеринг хрустящей формы), где отображаемые поля формы зависят от параметра, переданного форме из представления. Я считаю, что параметр передается правильно, но тем не менее все еще отображаются поля формы.Django поля формы в зависимости от параметра с Crispy Forms
Модель «IndividualFeedback» содержит поля, которые могут использоваться для различных типов оценки и имеет 8 полей для категорий обратной связи. Сколько из них отображается, должно зависеть от типа оценки, который я указываю в представлениях. Я бы хотел, чтобы тип оценки «ESSAY» отображал 4 из этих полей категорий, а тип «ПРЕЗЕНТАЦИЯ» отображал 3. В настоящее время я получаю все 8 независимо от того, что я передаю.
Вот мой 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',
]
Код в views.py довольно прямо вперед и, очевидно, проходит правильный параметр на - как показано в строке «печать».
Как я могу заставить это работать?
И как второй вопрос: достаточно ли для тестирования просто проверить «assertContains» в form_as_p() или мне нужно что-то еще из-за хрустящих форм?
Это не полностью устраняет проблему: пока форма теперь отображается как планировалось сначала (четыре категории, за которыми следуют комментарии и отметки), остальные 4 категории появляются после отметки. Нужно ли мне обращаться к этому в полях в классе «Мета»? – Tobi
О, да, похоже, вам нужно это сделать: https://github.com/maraujop/django-crispy-forms/blob/e31e39561c10b01be3693914aad1aa79350f5647/crispy_forms/helper.py#L316 – dukebody