Метод as_p
Метод as_p применяется к экземпляру класса Form и возвращает строку HTML, в которой каждое поле формы обернуто в тег < p>. Этот метод автоматически генерирует разметку с метками, виджетами и сообщениями об ошибках для каждого поля. Метод удобно использовать для быстрого вывода формы в вертикальном виде без необходимости ручного написания HTML-кода.
Синтаксис
form.as_p()
Метод не принимает аргументов и возвращает строку с HTML-разметкой.
Пример
Рассмотрим базовую форму регистрации, состоящую из полей имени, email и пароля:
from django import forms
class RegistrationForm(forms.Form):
username = forms.CharField(label="Имя пользователя", max_length=100)
email = forms.EmailField(label="Email")
password = forms.CharField(label="Пароль", widget=forms.PasswordInput)
В представлении создадим экземпляр формы и передадим его в шаблон:
from django.shortcuts import render
from .forms import RegistrationForm
def register(request):
form = RegistrationForm()
res = form.as_p()
return render(request, 'register.html', {'form': form})
В шаблоне вызовем метод as_p для отображения формы:
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">Зарегистрироваться</button>
</form>
Результат выполнения кода в браузере:
<p>
<label for="id_username">Имя пользователя:</label>
<input type="text" name="username" maxlength="100" required id="id_username">
</p>
<p>
<label for="id_email">Email:</label>
<input type="email" name="email" required id="id_email">
</p>
<p>
<label for="id_password">Пароль:</label>
<input type="password" name="password" required id="id_password">
</p>
Пример
Рассмотрим отображение формы с ошибками валидации. При передаче связанного экземпляра формы метод as_p автоматически выводит сообщения об ошибках:
from django import forms
class LoginForm(forms.Form):
username = forms.CharField(label="Имя пользователя", max_length=50)
password = forms.CharField(label="Пароль", widget=forms.PasswordInput)
def login_view(request):
if request.method == 'POST':
form = LoginForm(request.POST)
if form.is_valid():
# Обработка данных
return redirect('home')
else:
form = LoginForm()
res = form.as_p()
return render(request, 'login.html', {'form': form})
Результат выполнения кода в браузере при наличии ошибок:
<p>
<label for="id_username">Имя пользователя:</label>
<input type="text" name="username" maxlength="50" required id="id_username">
<span class="error">Это поле обязательно.</span>
</p>
<p>
<label for="id_password">Пароль:</label>
<input type="password" name="password" required id="id_password">
<span class="error">Это поле обязательно.</span>
</p>
Пример
Метод as_p можно комбинировать с другими методами рендеринга для частичного отображения формы. Например, разделим форму на две части:
from django import forms
class ProfileForm(forms.Form):
first_name = forms.CharField(label="Имя", max_length=50)
last_name = forms.CharField(label="Фамилия", max_length=50)
birth_date = forms.DateField(label="Дата рождения")
phone = forms.CharField(label="Телефон", required=False)
def edit_profile(request):
form = ProfileForm()
# Получим HTML только для первых двух полей
first_part = form.as_p(fields=['first_name', 'last_name'])
# Остальные поля отобразим отдельно
other_part = form.as_p(exclude=['first_name', 'last_name'])
return render(request, 'profile.html', {'form': form})
Результат выполнения кода:
"<p><label for=\"id_first_name\">Имя:</label> <input type=\"text\" name=\"first_name\" maxlength=\"50\" required id=\"id_first_name\"></p>\n<p><label for=\"id_last_name\">Фамилия:</label> <input type=\"text\" name=\"last_name\" maxlength=\"50\" required id=\"id_last_name\"></p>"