2009-08-10 7 views
14

Django'da bir profil formu hazırlıyorum. Çok sayıda isteğe bağlı ekstra profil alanı var ama sadece bir seferde ikiyi göstermek istiyorum. Dinamik olarak göstermek istemediğim alanları nasıl gizlerim veya kaldırırım? Sen Formunda bu kodlama vardırDjango'da form alanlarını dinamik olarak nasıl gizlersiniz?

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

İlgili yanıt: http://stackoverflow.com/a/1914812/462865 –

cevap

14

Sanırım cevabımı buldum.

İlk Denedim: işe yaramadı hangi

field.widget = field.hidden_widget 

.

doğru yolu olur:

field.widget = field.hidden_widget() 
0

: Burada

Ben bugüne kadar ne olduğunu. Şablon kodunda CSS ve JavaScript kullanarak bunu yapmak daha mantıklı olmaz mıydı? Bir alanı gizlemek, "display = 'none'" ayarını yapmak ve 'bloke' seçeneğine çevirmek kadar kolaydır, örneğin görüntülemeniz gerekiyorsa. İhtiyaçların ne olduğuna dair bazı bağlamlar bunu açıklığa kavuşturabilir.

+3

İlk olarak, sadece form mantığının formda kalması gerektiğini düşündüğümden. Ayrıca, daha önce hangi alanların doldurulduğunu görüyorum ve bunları göstermiyorum. –

+1

Bu, iş mantığını sunum katmanına taşır ("bu nesneler bu alana sahip değil"). Web geliştiricisi, arka uç geliştirici DEĞİL ise özellikle kötü. –

3

da

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'] 

kullanımı yerine self.exclude ait silmek kullanabilir.