Django forms integerField set max_value on runtime

好久不见. 提交于 2019-12-23 12:53:40

问题


I've got a form like this:

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

How can I set the max_values at runtime? I.E

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

回答1:


you can set the max values on fields in the __init__ method, as shown here

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)

edit:

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

didn't worked when I tried, redefining the field definition like this works

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



回答2:


After reading django source, I came up with something like this:

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)

The checking part is because it would sometimes add the same validator several times (No idea why)

[edit] After checking again, this isn't working as it should. Apparently it always uses the max_values of the first person to use the form - it doesn't make much sense really.



来源:https://stackoverflow.com/questions/3470741/django-forms-integerfield-set-max-value-on-runtime

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!