2009-08-10 50 views
14

Estoy haciendo un formulario de perfil en Django. Hay muchos campos de perfil adicionales opcionales, pero solo me gustaría mostrar dos a la vez. ¿Cómo oculto o elimino los campos que no quiero mostrar dinámicamente?¿Cómo se ocultan dinámicamente los campos de formulario en Django?

Esto es lo que tengo hasta ahora:

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

Respuesta relacionada: http://stackoverflow.com/a/1914812/462865 –

Respuesta

14

Creo que encontré mi respuesta.

Primero probé:

field.widget = field.hidden_widget 

los cuales no funcionaba.

La forma correcta pasa a ser:

field.widget = field.hidden_widget() 
0

Usted está codificando esto en el formulario. ¿No tendría más sentido hacer esto usando CSS y JavaScript en el código de la plantilla? Ocultar un campo es tan fácil como configurar "display = 'none'" y alternarlo a 'block', por ejemplo, si necesita mostrarlo.

Quizás algún contexto sobre cuál es el requisito aclararía esto.

+3

En primer lugar, porque creo que la lógica de la forma debe permanecer en el formulario. Además, porque veo qué campos ya se han llenado antes y no los muestro. –

+1

Esto mueve la lógica empresarial a la capa de presentación ("estos objetos no tienen este campo"). Especialmente malo si el desarrollador web NO es el desarrollador de back-end. –

3

También puede utilizar

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 borrar en lugar de self.exclude.

Cuestiones relacionadas