2010-06-04 7 views
4

J'ai une forme qui doit avoir soit une URL valide ou un fichier valide pour le téléchargement:Comment dynamiser la validation de formulaire django?

class ResourceUpload(ModelForm): 
    ...   
    uploadedfile = forms.FileField('file') 
    url_address = forms.URLField('url') 
    ... 

Comment puis-je remplacer les FileField et URLField validateurs de sorte que Django ne fait que soulever une erreur si les deux champs ci-dessus sont invalides mais excepte invalide tant que l'autre est valide?

Répondre

7

Vous aurez besoin de les définir à la fois comme required=False, de sorte que le back-end de base de données n'a pas besoin tous les deux remplis, puis utilisez form cleaning:

import forms 

class ResourceUpload(ModelForm): 
    ...   
    uploadedfile = forms.FileField(required = False, upload_to='put/files/here') 
    url_address = forms.URLField(required = False) 
    ... 

    def clean(self): 
     cleaned_data = self.cleaned_data 
     uploadedfile = cleaned_data.get("uploadedfile ") 
     url_address = cleaned_data.get("url_address ") 

     if not uploadedfile and mot url_address : 
      raise forms.ValidationError("Provide a valid file or a valid URL.") 

     return cleaned_data   
7

ma solution
pros: il conserve l'astérisque pour le champ vraiment requis et les messages d'erreur par défaut

class Form(forms.ModelForm): 
    field1 = SelectField 
    field2 = ... 
    field3 = ... 

    def __init__(self, *args, **kwargs): 
     super(Form, self).__init__(*args, **kwargs) 
     if kwargs['data']: 
      if kwargs['data'].get('field1') == '1': 
       self.fields['field2'].required = True 
       self.fields['field3'].required = False 
      elif kwargs['data'].get('field1') == '2': 
       self.fields['field2'].required = False 
       self.fields['field3'].required = True 
4

Voilà ma solution qui fonctionne vraiment ... (testé)

def __init__(self, *args, **kwargs): 
    super(YourForm, self).__init__(*args, **kwargs) 

    if self.data and self.data.get('field_name') != 'SOMETHING': 
     self.fields.get('field_name2').required = True 

Cela fait field_name2 un champ obligatoire si l'entrée de field_name n'était pas 'SOMETHING'. Les roches de Django!

+0

Django vraiment des pierres! –

Questions connexes