Django расширенная проверка формы с практическими рекомендациями? - PullRequest
0 голосов
/ 27 мая 2011

Из просмотра документации видно, что метод form clean () предназначен только для упрощенной проверки синтаксиса, такой как проверка того, что адрес электронной почты заканчивается на «.com» или «.edu», или обеспечениечто пользователь выбирает не более трех элементов из списка «выбери три своих любимых телепередачи».

Я работаю над приложением, которое позволяет пользователям устанавливать свой пароль, и я хочу убедиться, что ихпароль не содержит логин или настоящее имя, а метод clean () не кажется подходящим местом для проведения такого рода проверки, как с точки зрения дизайна, так и с практического ограничения, связанного с методом clean ()не имеет доступа к данным сеанса.

Где лучше всего проводить более тяжелую проверку?Если после вызова form.is_valid() я выполню некоторую пользовательскую проверку в представлении, есть ли способ вернуться к стандартной обработке ошибок формы?

У меня есть идея, что код может выглядеть следующим образом:

def process_login(request):
    """Display or process the login form."""

    if request.method == 'POST':
        form = LoginForm(request.POST)

        if form.is_valid():
            password = form.cleaned_data['password']
            if password_is_bad(password, request):
                # what now?

Ответы [ 3 ]

3 голосов
/ 27 мая 2011

Я предпочитаю делать все проверки в форме. Если я размышляю об ответственности объекта, я думаю о форме как об объекте, который описывает компоненты формы и способ преобразования между формой HTML и valid python-объектом, где «valid» включает специфичные для приложения требования.

Если форме требуется информация, к которой она обычно не имеет доступа, я передаю эту информацию конструктору формы. Непроверенный код следует:

class MyForm(Form):
    def __init__(self, session, *args, **kwargs):
        self.session = session
        super(MyForm, self).__init__(self, *args, **kwargs)

    def clean(self):
        # does something with self.session

Преимущество этого подхода заключается в том, что ваши представления часто можно сделать очень общими, зачастую вплоть до простой передачи экземпляра объекта формы в пользовательское универсальное представление.

3 голосов
/ 27 мая 2011

Также есть специфичные для поля проверки: clean_$fieldname.Подробности см. В этом разделе документации django.

Обновление: Что касается передачи информации о сеансе в форму, это легко сделать с помощью назначения атрибута:может получить доступ к self.session в методе clean_password.

0 голосов
/ 27 мая 2011

Если вы действительно хотите проверить некоторые части формы в представлении, вы можете вызвать исключение ValidationError, которое вернет пользователя назад и отобразит ваше сообщение об ошибке.

from django.forms.util import ValidationError

if len( form.cleaned_data['password'] ) < 5:
    raise ValidationError('You have to type at least five characters')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...