Django создает integerField для установки max_value во время выполнения - PullRequest
4 голосов
/ 12 августа 2010

У меня есть такая форма:

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

Как я могу установить max_values ​​во время выполнения? * 1004 т.е. *

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

Ответы [ 2 ]

5 голосов
/ 12 августа 2010

вы можете установить максимальные значения для полей в методе __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)

edit:

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

не работало, когда я пытался, переопределениеопределение поля, как это работает

self.fields['first'] = forms.IntegerField(max_value=max_values['first'])
1 голос
/ 13 августа 2010

После прочтения источника в django я придумал что-то вроде этого:

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)

Проверяющая часть состоит в том, что она иногда добавляет один и тот же валидатор несколько раз (понятия не имею, почему)

[править] После повторной проверки, это не работает так, как должно. Очевидно, он всегда использует max_values ​​первого лица, использующего форму - это не имеет особого смысла на самом деле.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...