iTeam1991
@iTeam1991
Техник-электронщик, 25 лет

Как понять этот кусочек кода на Django?

Начал изучать фреймворк Django по книге "Learning Website Development with Django". Возник такой вопрос.
Вот такая вот есть вьюха:
def register_page(request):
	if request.method == 'POST':
		form = RegistrationForm(request.POST)
		if form.is_valid():
			user = User.objects.create_user(
				username=form.cleaned_data['username'],
				password=form.cleaned_data['password1'],
				email=form.cleaned_data['email']
			)
			return HttpResponseRedirect('/register/success/')
	else:
		form = RegistrationForm()
	variables = RequestContext(request, {
		'form': form
	})
	return render_to_response('registration/register.html', variables)

Есть template registration/register.html c POST формой
{% extends "base.html" %}
{% block title %}User Registration{% endblock %}
{% block head %}User Registration{% endblock %}
{% block content %}
    <form method="post" action=".">
        {% csrf_token %}
        {{ form.as_p }}
        <input type="submit" value="register" />
    </form>
{% endblock %}

и класс для нашей кастомной формы:
from django import forms

import re
from django.contrib.auth.models import User
from django.core.exceptions import ObjectDoesNotExist

class RegistrationForm(forms.Form):
    username = forms.CharField(label='Username', max_length=30)
    email = forms.EmailField(label='Email')
    password1 = forms.CharField(
        label='Password',
        widget=forms.PasswordInput()
    )
    password2 = forms.CharField(
        label='Password (Again)',
        widget=forms.PasswordInput()
    )

    def clean_password2(self):
        if 'password1' in self.cleaned_data:
            password1 = self.cleaned_data['password1']
            password2 = self.cleaned_data['password2']
            if password1 == password2:
                return password2
        raise forms.ValidationError('Passwords do not match.')

    def clean_username(self):
        username = self.cleaned_data['username']
        if not re.search(r'^\w+$', username):
            raise forms.ValidationError('Username can only contain alphanumeric characters and the underscore.')
        try:
            User.objects.get(username=username)
        except ObjectDoesNotExist:
            return username
        raise forms.ValidationError('Username is already taken.')

А вот и собственно вопросы:
1) Почему в коде вьюхи проверяется request.method == 'POST'? Ведь у меня есть POST форма и никаких неоднозначности не может быть. И что делается если это условие не выполняется?
2) В чем разница между
form = RegistrationForm(request.POST)
и
form = RegistrationForm()
и что делает каждая из них? Точнее я знаю, что вызывается конструктор для forms.Form. Но я не знаю его реализации и не знаю какой результат будет.
  • Вопрос задан
  • 550 просмотров
Решения вопроса 1
@asd111
1) Можно не проверять, а использовать декораторы или Class based view. Проверка используется в самых простых view как в вашем примере. Проверка нужна чтобы знать какой запрос пришел. Если пришел POST запрос значит форма была отправлена, если пришел GET запрос, значит форму нужно вывести, чтобы её потом можно было отправить.
2) form = RegistrationForm(request.POST) создает объект класса RegistrationForm с данными из request.POST, т.е. с данными из POST запроса;
form = RegistrationForm() создает пустой объект класса RegistrationForm
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы