Django在运行时形成integerField set max_value

Rob*_*bus 4 forms django django-forms

我有一个这样的表格:

class SomeForm(forms.Form):
 first = forms.IntegerField(max_value= DontWantToSetYet)
 second = forms.IntegerField(max_value= DontWantToSetYet)
 third = forms.IntegerField(max_value= DontWantToSetYet)
Run Code Online (Sandbox Code Playgroud)

如何在运行时设置max_values?IE

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

Ash*_*hok 5

您可以在__init__方法中的字段上设置最大值,如下所示

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)
Run Code Online (Sandbox Code Playgroud)

编辑:

self.fields['first'].max_value = max_values['first']
Run Code Online (Sandbox Code Playgroud)

当我尝试时没有奏效,重新定义像这样的字段定义

self.fields['first'] = forms.IntegerField(max_value=max_values['first'])
Run Code Online (Sandbox Code Playgroud)

  • 我有一个地方,我从外键集的计数.我这样做:`self.fields ['field_name'].widget.attrs.update({'min':0,'max':self.instance.foreignobject_set.count()})`.这样您就不必实例化新的窗口小部件,并且在`attrs`上使用`.update()`可确保您不会覆盖其他地方设置的值. (2认同)
  • @beruic 答案应该被接受,因为它不会覆盖创建的对象 (2认同)