Хостинг Django от «Джино»
Table of contents

Собственные правила проверки

Представьте, что мы выложили форму на боевой сервер и к нам начали приходить сообщения. Но есть одна проблема — некоторые сообщения содержат всего одно-два слова, что недостаточно для нашей цели. Мы решили применить новую политику проверки: четыре слова или больше, пожалуйста.

Существует ряд методов реализации собственного механизма проверки в форме. Если наше правило будет использоваться в других проектах, мы можем создать собственный тип поля. Большинство пользовательских проверок не используются повторно, хотя и могут быть внедрены в класс 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 и оригинальное значение будет утеряно.

GoldenCopywr 7 months, 3 weeks ago
Answer Link

Отличный пример могущества наследования. Мощная, удобная библиотека forms


Ищем Python программистов

Found misprint?
Select it with the mouse and hit Enter
Ctrl-Enter
Processed:
33 1 199 25


The full repository of DjangoBook translation you can get on GitHub.
We appreciate your patches!

We are glad to hear your questions, comments or suggestions!
(Open in new tab)

Users number: 601

Русская группа

на поддержку перевода
Яндекс Яндекс.Деньги Хочу такую же кнопку
Ускорить процесс перевода!
ЯМ:41001223475816


© 2008-2012 Ruslan Popov @ gmail.com Powered by Django 1.2.5