2009-08-10 18 views
14

Tworzę formularz profilu w Django. Istnieje wiele opcjonalnych dodatkowych pól profilu, ale chciałbym pokazać tylko dwa naraz. Jak ukryć lub usunąć pola, których nie chcę wyświetlać dynamicznie?Jak dynamicznie ukrywać pola formularza w Django?

Oto co mam do tej pory:

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

Powiązana odpowiedź: http://stackoverflow.com/a/1914812/462865 –

Odpowiedz

14

Myślę, że znalazłem odpowiedź.

Najpierw próbowałem:

field.widget = field.hidden_widget 

który nie działa.

Prawidłowy sposób zdarza się:

field.widget = field.hidden_widget() 
0

Jesteś kodowanie to w formularzu. Czy nie byłoby sensu robić tego za pomocą kodu CSS i JavaScript w kodzie szablonu? Ukrywanie pola jest tak proste, jak ustawienie "display = 'none" "i przełączenie go z powrotem na' blok ', powiedzmy, jeśli chcesz go wyświetlić.

Być może jakiś kontekst na temat tego, co jest wymagane, wyjaśni to.

+3

Po pierwsze, tylko dlatego, że myślę, że logika formy powinna pozostać w formie. Ponadto, ponieważ widzę, które pola zostały już wcześniej wypełnione i nie pokazują tych pól. –

+1

Przenosi to logikę biznesową do warstwy prezentacji ("te obiekty nie mają tego pola"). Szczególnie źle, jeśli web developer NIE jest programistą backendowym. –

3

mogą również korzystać

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

użycie usuwać zamiast self.exclude.

Powiązane problemy