2010-08-12 7 views
4

J'ai une forme comme ceci:formes Django IntegerField mis max_value sur l'exécution

class SomeForm(forms.Form): 
first = forms.IntegerField(max_value= DontWantToSetYet) 
second = forms.IntegerField(max_value= DontWantToSetYet) 
third = forms.IntegerField(max_value= DontWantToSetYet) 

Comment puis-je régler les max_values ​​lors de l'exécution? IE

if request.method == 'POST': 
    form = SomeForm(request.POST, max_values = {'first':10,'second':50,'third':666}) 
    [...] 

Répondre

5

vous pouvez définir les valeurs maximales sur les champs dans la méthode __init__, comme indiqué ici

class SomeForm(forms.Form): 
    def __init__(self, max_values, *args, **kwargs): 
     super(SomeForm, self).__init__(*args, **kwargs) 
     self.fields['first'] = forms.IntegerField(max_value=max_values['first']) 
     ... 

    first = forms.IntegerField(max_value= DontWantToSetYet) 
    second = forms.IntegerField(max_value= DontWantToSetYet) 
    third = forms.IntegerField(max_value= DontWantToSetYet) 

modifier:

self.fields['first'].max_value = max_values['first'] 

n'a pas travaillé quand j'ai essayé, redéfinir la définition de champ comme ceci fonctionne

self.fields['first'] = forms.IntegerField(max_value=max_values['first']) 
+2

J'ai un endroit où je fais cela à partir du compte d'un jeu de clés étrangères. Je le fais comme ceci: 'self.fields ['field_name']. Widget.attrs.update ({'min': 0, 'max': self.instance.foreignobject_set.count()})'. De cette façon, vous n'avez pas besoin d'instancier un nouveau widget, et en utilisant '.update()' sur 'attrs', vous vous assurez que vous n'écrasez pas les valeurs définies ailleurs. – beruic

+0

La réponse @beruic doit être acceptée une, car elle n'écrase pas l'objet créé –

1

Après avoir lu source django, je suis venu avec quelque chose comme ceci:

def __init__(self, max_values, *args, **kwargs): 
    super(SendFleetFormOne, self).__init__(*args, **kwargs) 
    for name, value in max_values.items(): 
     if name not in self._done: 
      self.fields[name].validators.append(validators.MaxValueValidator(value)) 
      self._done.append(name) 

La partie la vérification est parce qu'il serait parfois ajouter le même validateur plusieurs fois (Aucune idée pourquoi)

[modifier] Après vérifier à nouveau, cela ne fonctionne pas comme il se doit. Apparemment, il utilise toujours les valeurs max_values ​​de la première personne pour utiliser le formulaire - cela n'a vraiment pas beaucoup de sens.