четверг, 7 ноября 2013 г.

Валидация форм в Django

Пусть у нас есть простая форма регистрации пользователя в системе на Django. Для того, чтобы пользователь мог зарегистрироваться, нужно предоставить ему возможность указать логин и пароль:


Если пользователь не заполнил какое-то поле, то выводим определенное сообщение об ошибке:
Теперь рассмотрим, как можно реализовать такую валидацию формы в Django.

1. Создадим приложение registration.
manage.py startapp registration

2. Подключим к нашему проекту созданное приложение, указав его в settings.py, а также путь к папке с его шаблонами:
INSTALLED_APPS = (
    # ...
    'registration',
)
# ...
TEMPLATE_DIRS = (
    # ...
    'registration/templates',
)

3. Подключим роуты нашего приложения в главном файле роутов проекта testsite/urls.py:
from django.conf.urls import patterns, include, url

from django.contrib import admin
admin.autodiscover()

urlpatterns = patterns('',

    url(r'^registration/', include('registration.urls')),
    url(r'^admin/', include(admin.site.urls)),
)

4. Определим роуты нашего приложения registration/urls.py:
from django.conf.urls import patterns, include, url

urlpatterns = patterns('',

    url(r'^$', 'registration.views.registrate', name='registration'),
)

5. Определим представление нашего приложения в registration/views.py:
# -*- coding:utf-8 -*-
from django.shortcuts import render
from django.http import HttpResponse

# Это наша форма, которую мы определим в forms.py
from .forms import RegistrationForm

def registrate(request):
    if request.POST:
        form = RegistrationForm(request.POST)
        if form.is_valid():
            # Просто выводим сообщение о том, что все ОК!
            return HttpResponse('Форма верна!')
    else:
        form = RegistrationForm()
    return render(request, 'registrate.html', {'form': form})

6. Представление использует форму. Определим ее в registration/forms.py:
# -*- coding:utf-8 -*-

from django.forms import CharField, Form, PasswordInput
from django import forms

class RegistrationForm(Form):
    login = CharField(
        label='Логин', 
        max_length=100, 
        error_messages={'required': 'Укажите логин'})
    password = CharField(
        label='Пароль', 
        widget=PasswordInput(),
        error_messages={'required': 'Укажите пароль'})
    password_again = CharField(
        label='Пароль (еще раз)', 
        widget=PasswordInput(),
        error_messages={'required': 'Укажите пароль еще раз'})
    
    # Валидация проходит в этом методе
    def clean(self):
        # Определяем правило валидации
        if self.cleaned_data.get('password') != self.cleaned_data.get('password_again'):
            # Выбрасываем ошибку, если пароли не совпали
            raise forms.ValidationError('Пароли должны совпадать!')
        return self.cleaned_data

7. Также представление использует шаблон. Определим его в registration/templates/registrate.html:
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>Registration</title>
</head>
<body>
   <h2>Регистрация</h2>
   <form action="" method="post">
       {{ form.as_p }}
       <input type="submit" value="Отправить" />
       {% csrf_token %}
   </form>
</body>
</html>

8. Теперь вы можете перейти по адресу http://127.0.0.1:8000/registration/ и посмотреть, как работает валидация в Django-приложении, которое мы написали.

Скачать исходники кода Django-приложения этого урока



Комментариев нет:

Отправить комментарий