2009-08-10 3 views
14

Sto creando un profilo in Django. Ci sono molti campi extra del profilo opzionali, ma mi piacerebbe solo mostrarne due alla volta. Come nascondo o rimuovo i campi che non voglio mostrare dinamicamente?Come nascondi dinamicamente i campi del modulo in Django?

Ecco quello che ho finora:

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

Risposta correlata: http://stackoverflow.com/a/1914812/462865 –

risposta

14

Penso di aver trovato la mia risposta.

Per prima cosa ho provato:

field.widget = field.hidden_widget 

che non ha funzionato.

Il modo corretto sembra essere:

field.widget = field.hidden_widget() 
0

si esegue la codifica presente nel modulo. Non avrebbe più senso farlo usando CSS e JavaScript nel codice del template? Nascondere un campo è facile come impostare "display = 'none" "e riportarlo su" block ", ad esempio, se è necessario visualizzarlo.

Forse qualche contesto su quale sia il requisito sarebbe chiarire questo.

+3

In primo luogo, solo perché ritengo che la logica della forma debba rimanere nella forma. Inoltre, perché vedo quali campi sono già stati compilati e non li mostro. –

+1

Questo sposta la logica di business nel livello di presentazione ("questi oggetti non hanno questo campo"). Soprattutto se lo sviluppatore web NON è lo sviluppatore di back-end. –

3

anche possibile utilizzare

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

uso eliminare invece di self.exclude.