Формы

# forms.py
# описание форм

from django import forms

class SomeForm(forms.Form):

    name = forms.CharField(max_length=100)
    age = forms.IntegerField()
    password = forms.CharField(widget=forms.PasswordInput)

class DetailsForm2(forms.Form):

    def __init__(self, *args, **kwargs):
        upgrade = kwargs.pop('upgrade', False)

        super().__init__(*args, **kwargs)

        if upgrade:
            self.fields["upgrade"] = forms.BooleanField(label="Upgrade")
# обработка форм в представлениях

from .forms import EmailPostForm

def post(request, post_id):

    post = get_object_or_404(Post, id=post_id)

    if request.method == "POST":
        form = EmailPostForm(request.POST)
        if form.is_valid():
            email = form.cleaned_data['email']
    else:
        form = EmailPostForm()

    return render(
        request,
        'index.html',
        {
            'post': post,
            'form': form,
        },
    )
<!-- отображение форм в шаблонах -->

<form action="." method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <input type="submit">
</form>

<form action="." method="post">
    {% csrf_token %}
    {% for field in form %}
        {{ field }}
        {{ field.errors }} - html-код, список ошибок поля
        {{ field.help_text }} - дополнительный текст
        {{ field.is_hidden }} - булево, поле скрыто
        {{ field.label }} - текст надписи
        {{ field.label_tag }} - html-код, записи
        {{ field.name }} - имя поля
    {% endfor %}
    <input type="submit">
</form>

Form

class django.forms.Form

Базовая форма

cleaned_data

Данные формы

is_bound

Возвращает булево, заполнена ли форма

required_css_class

Строка, название класса стиля обязательного поля формы

class SomeForm(Form):

    required_css_class = 'required'
error_css_class

Строка, название класса стиля поля формы с ошибкой

class SomeForm(Form):

    error_css_class = 'error'
as_p()

Возвращает строку, HTML форма используя параграфы p

form.as_p()
# <p><label ... /><input ... /></p>
as_table()

Возвращает строку, HTML форма используя таблицы table

form.as_p()
# <tr><th><label ... /></th><td><input ... /></td></tr>
as_ul()

Возвращает строку, HTML форма используя списки ul

form.as_p()
# <li><label ... /><input ... /></li>
clean()

Валидирует всю форму.

class SomeForm():

    def clean(self):
        cd = super().clean()
        if cd['password'] != cd['password2']:
            raise forms.ValidationError('Passwords don\'t match.')
        return cd
clean_some_field()

Валидирует конкретное поле формы.

class SomeForm():

    def clean_password2(self):
        cd = self.cleaned_data
        if cd['password'] != cd['password2']:
            raise forms.ValidationError('Passwords don\'t match.')
        return cd['password2']
hidden_fields()

Возвращает список всех не видимых полей формы

is_valid()

Возвращает булево, валидные ли данным на форме

save(commit=True)

Сохраняет объект в БД и возвращает его

visible_fields()

Возвращает список всех видимых полей формы

ModelForm

class django.forms.ModelForm

Форма по модели, аналогичен форме django.forms.Form, но автоматический работает с указанной моделью.

class SomeForm(forms.ModelForm):
    class Meta:

        # модель, по которой будет строиться форма
        model = SomeModel

        # поля, которые должны быть в форме
        fields = ()

        # поля, которых не должно быть в форме
        exclude = ()

        # словарь, надписи для элементов
        labels = {
            'field_name': 'label',
        }

        # словарь, вспомогательный текст для элементов
        help_texts = {
            'field_name': 'help_text',
        }

        # словарь, виджеты для элементов
        widgets = {
            'field_name': forms.HiddenInput,
        }

        # словарь сообщений для кодов ошибок
        # required, min_length, max_length, invalid_choice, invalid,
        # min_value, max_value
        error_messages = {
            'field_name': {
                'error_code': 'text',
            },
        }
class UserRegistrationForm(forms.ModelForm):

    password = forms.CharField(
        label='Password',
        widget=forms.PasswordInput,
    )
    password2 = forms.CharField(
        label='Repeat password',
        widget=forms.PasswordInput,
    )

    class Meta:
        model = User
        fields = ('username', 'first_name', 'email)

    def clean_password2(self):
        cd = self.cleaned_data
        if cd['password'] != cd['password2']:
            raise forms.ValidationError('Passwords don\'t match.')
        return cd['password2']