代码之家  ›  专栏  ›  技术社区  ›  Robus

Django Forms IntegerField在运行时设置最大值

  •  4
  • Robus  · 技术社区  · 15 年前

    我有一张这样的表格:

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

    如何在运行时设置最大值?即

    if request.method == 'POST':
        form = SomeForm(request.POST, max_values = {'first':10,'second':50,'third':666})
        [...]
    
    2 回复  |  直到 15 年前
        1
  •  5
  •   Ashok    15 年前

    您可以在 __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)
    

    编辑:

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

    我试过的时候没用,像这样重新定义字段定义

    self.fields['first'] = forms.IntegerField(max_value=max_values['first'])
    
        2
  •  1
  •   Robus    15 年前

    在阅读了《姜戈资料》之后,我想到了这样的事情:

    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)
    

    检查部分是因为它有时会多次添加相同的验证器(不知道为什么)

    [编辑] 在再次检查之后,这并没有像应该的那样工作。显然,它总是使用第一个使用表单的人的最大值——这实际上没有什么意义。