Представьте, что мы выложили форму на боевой сервер и к нам начали приходить сообщения. Но есть одна проблема — некоторые сообщения содержат всего одно-два слова, что недостаточно для нашей цели. Мы решили применить новую политику проверки: четыре слова или больше, пожалуйста.
Существует ряд методов реализации собственного механизма
проверки в форме. Если наше правило будет использоваться в
других проектах, мы можем создать собственный тип
поля. Большинство пользовательских проверок не используются
повторно, хотя и могут быть внедрены в класс
Form.
Раз нам требуется дополнительная проверка поля
message, добавим метод
clean_message() в наш класс:
from django import forms
class ContactForm(forms.Form):
subject = forms.CharField(max_length=100)
email = forms.EmailField(required=False)
message = forms.CharField(widget=forms.Textarea)
def clean_message(self):
message = self.cleaned_data['message']
num_words = len(message.split())
if num_words < 4:
raise forms.ValidationError("Not enough words!")
return message
Библиотека автоматически ищет любой метод, который начинается с clean_ и заканчивается на имя поля. Если такой метод существует, он используется во время выполнения проверки поля.
Данный метод clean_message() будет вызван
после выполнения стандартной проверки для
данного поля (в этом случае, необходимая проверка для
CharField). Так как значение поля уже
будет частично проверено, мы получаем его из
self.cleaned_data. Также, нам не стоит
беспокоиться о наличии значения или о том, что оно пустое, всё
это обеспечит стандартный обработчик.
Мы просто используем комбинацию len() и
split() для подсчёта количества слов. Если
пользователь ввёл слишком мало слов, мы вызываем исключение
ValidationError модуля
forms. Строка, переданная исключению, будет
отображена пользователю в виде элемента списка ошибок.
Важно то, что мы явно возвращаем обработанное значение поля в конце метода. Это позволяет нам модифицировать значение (или преобразовать его в другой тип Python) в рамках данного метода. Если мы забудем воспользоваться оператором return, тогда будет возвращён None и оригинальное значение будет утеряно.
| Пред. | Уровень выше | След. |
| Установка начальных значений | Начало | Определение меток |
3 comments | Make a comment
Отличный пример могущества наследования. Мощная, удобная библиотека forms
А если при наследовании формы нам не понадобится эта проверка как быть?
Просто переопределите этот метод, ничего в нём не делая и не вызывая метод предка.