2011-03-23 3 views
0

J'ai deux ModelField (Char et Decimal) et il serait trivial de les nettoyer séparément avec la méthode clean_formfield(). Mais au lieu d'afficher les deux champs de formulaire, je voudrais afficher juste un champ de saisie en combinaison avec un champ ChoiceField où l'utilisateur peut décider si la prochaine entrée sera un mot ou un nombre. La scission est nécessaire parce que je voudrais faire une agrégation avec les nombres plus tard.Nettoyer Formfield tardif - nettoyer Formfield dans la sous-classe Form

Il est évident que je ne peux pas utiliser clean_formfield() en raison d'une dépendance, donc il doit aller dans le nettoyeur de formulaires. La question est de savoir comment réaliser un «nettoyage Formfield tardif»?

class Input(models.Model): 
    ... 
    number = models.DecimalField() 
    word = models.CharField() 
    ... 

class InputForm(forms.ModelForm): 
    ... 
    type = forms.CharField(widget=forms.RadioSelect(choices=(('word','Word'),('number','Number'),))) 
    input = forms.CharField() 
    ... 
    def clean(self): 
     cleaned_data = self.cleaned_data 
     type = cleaned_data.get('type') 
     input = cleaned_data.get('input') 

    if type == 'number':   
     <<<clean_Decimal_Formfield>>> 
     cleaned_data['number'] = input 
     cleaned_data['word'] = None 
    else: 
     <<<clean_Char_Formfield>>>   
     cleaned_data['number'] = None 
     cleaned_data['word'] = input 

    return cleaned_data 

Répondre

0

Il n'est pas nécessaire d'inventer une nouvelle méthode pour 'nettoyage FormField Late'! Il suffit de le faire comme ceci:

... 
if type == 'number':   
    cleaned_data['number'] = input 
    cleaned_data['word'] = None 
else: 
    cleaned_data['number'] = None 
    cleaned_data['word'] = input 
... 
+0

ok mais maintenant il vous manque la validation sur le terrain! l'entrée contiendra ou quelque chose de valide pour un charfield ou quelque chose de valable pour un champ décimal! –

0

Je collerais avec ceci, 1 champ de modèle = 1 champ de formulaire. Si vous devez enregistrer un seul champ (nombre ou texte), vous pouvez masquer/afficher les deux champs en fonction de l'état de sélection de la radio (js trivial)

Pour éviter d'enregistrer les deux valeurs le formulaire vous permet de vérifier qu'un seul champ est rempli et que celui-ci est compatible avec la sélection radio.

+0

C'est une option, mais je préfère gérer ces choses aussi loin que possible dans le backend. – Holger