2009-08-10 4 views
14

Я делаю анкету в Django. Есть много дополнительных полей профилей, но я хотел бы показать только два за раз. Как скрыть или удалить поля, которые я не хочу показывать динамически?Как вы динамически скрываете поля формы в Django?

Вот то, что я до сих пор:

class UserProfileForm(forms.ModelForm): 
    extra_fields = ('field1', 'field2', 'field3') 
    extra_field_total = 2 

    class Meta: 
     model = UserProfile 

    def __init__(self, *args, **kwargs): 
     extra_field_count = 0 
     for key, field in self.base_fields.iteritems(): 
      if key in self.extra_fields: 
       if extra_field_count < self.extra_field_total: 
        extra_field_count += 1 
       else: 
        # do something here to hide or remove field 
     super(UserProfileForm, self).__init__(*args, **kwargs) 
+0

Связанный ответ: http://stackoverflow.com/a/1914812/462865 –

ответ

14

Я думаю, что нашел свой ответ.

Сначала я попробовал:

field.widget = field.hidden_widget 

, который не работал.

Правильный путь, случается:

field.widget = field.hidden_widget() 
0

Вы кодирования это в форме. Не имеет ли смысл делать это с помощью CSS и JavaScript в коде шаблона? Скрытие поля так же просто, как установка «display = 'none» и переключение на «block», скажем, если вам нужно отобразить его.

Возможно, какой-то контекст того, что требовало, прояснит это.

+3

Во-первых, только потому, что я считаю, что логика формы должна оставаться в форме. Кроме того, потому что я вижу, какие поля уже были заполнены раньше и не показывают их. –

+1

Это перемещает бизнес-логику в уровень представления («эти объекты не имеют этого поля»). Особенно плохо, если веб-разработчик НЕ является сторонним разработчиком. –

3

Можно также использовать

def __init__(self, instance, *args, **kwargs):  
    super(FormClass, self).__init__(instance=instance, *args, **kwargs) 
    if instance and instance.item: 
     del self.fields['field_for_item'] 
3
def __init__(self, *args, **kwargs): 
      is_video = kwargs.pop('is_video') 
      is_image = kwargs.pop('is_image') 
      super(ContestForm, self).__init__(*args, **kwargs) 
      if is_video: 
       del self.fields['video_link'] 
       #self.exclude('video_link') 
      if is_image: 
       del self.fields['image'] 

использование удалить вместо self.exclude.

Смежные вопросы