2014-10-25 2 views
0

Я пытаюсь иметь форму 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() или мне нужно что-то еще из-за хрустящих форм?

ответ

0

Вы создаете переменную с именем 'helper', но не присваиваете ее экземпляру формы. Вы должны использовать self.helper = FormHelper:

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': 
      ... 

Смотрите пример http://django-crispy-forms.readthedocs.org/en/latest/form_helper.html#formhelper-with-a-form-attached-default-layout.

Вы также можете удалить FormHelper() из определения класса вверху.

И, наконец, имейте в виду, что хрустящие формы будут автоматически добавлять любые поля, определенные в виде мета-класса, отсутствующего в макете. См. source.

+0

Это не полностью устраняет проблему: пока форма теперь отображается как планировалось сначала (четыре категории, за которыми следуют комментарии и отметки), остальные 4 категории появляются после отметки. Нужно ли мне обращаться к этому в полях в классе «Мета»? – Tobi

+0

О, да, похоже, вам нужно это сделать: https://github.com/maraujop/django-crispy-forms/blob/e31e39561c10b01be3693914aad1aa79350f5647/crispy_forms/helper.py#L316 – dukebody