Проверить данные формы: docs
- путем создания настраиваемого
Field
с проверкой - специфицированного c поля с помощью
fieldname_clean()
- путем замены
clean()
- с помощью валидаторов
? Как правильно реализовать эту функцию? Я немного отклонился от псевдокода в том, что вы спросили
Валидаторы документы
Уже есть множество буитин-валидаторов. Для этого создайте собственный валидатор, который проверяет значение в поле и вызывает ValidationError
.
Создайте validator.py в своем приложении
# validator.py
from django.core.exceptions import ValidationError
def validate_select_option(value):
if value == '-':
raise ValidationError('Invalid selection')
В forms.py импортируйте validate_select_option и добавить валидатор в поле
# forms.py
from .validator import validate_select_option
# other parts of code
form_field = CharField(label=the_label, widget=Select(choices=CHOICES), required=is_required, validator=[validate_select_option])
Этот валидатор validate_select_option
теперь можно использовать не только для поля, в котором есть варианты, но и для любого другого поля для проверки. Во всяком случае, это не его намерение. Таким образом, можно использовать любые поля с вариантами выбора :)
Поскольку вы сказали, что создаете форму динамически, и я предполагаю, что вы можете добавить дополнительные параметры в Field
, используя определение JSON файл. Для fieldname_clean()
и clean()
вам нужно будет добавить эти методы в свой класс Form. Пользовательское поле может быть создано и импортировано в. Но я думаю, что простые валидаторы могут сделать это легко.
? как мне даже получить выбранные значения для поля (в коде формы)
Если используются методы класса формы clean(self, *args, **kwargs)
и fieldname_clean(self, *args, **kwargs)
: вы можете получить доступ данные формы по self.cleaned_data
словарю. cleaned_data
создается только после is_valid()
.
При переопределении is_valid
, чтобы получить доступ к данным формы, нам нужно сначала вызвать родительскую проверку, а затем работать над ней.
def is_valid(self, *args, **kwargs):
# cannot access self.cleaned_data since it is not created yet
valid = super(myForm, self).is_valid()
# can access self.cleaned_data since it has been created when parent is_valid() has been called
for fieldname, field in self.fields.items():
if isinstance(field, forms.CharField): # the type of widget is not considered.
if fieldname in self.cleaned_data and field.required and self.cleaned_data[fieldname] == '-':
valid = False
return valid