Атрибут is_bound
Атрибут is_bound класса Form
является булевым свойством, которое указывает на то, была ли форма
связана с какими-либо данными (переданными в конструктор через
параметры data или files). Если форма создана
с переданными данными, атрибут возвращает True,
в противном случае - False. Это свойство полезно
для определения состояния формы и принятия решений
в представлениях и шаблонах.
Синтаксис
form.is_bound
Пример
Давайте создадим форму без данных и проверим значение атрибута is_bound:
from django import forms
class CommentForm(forms.Form):
author = forms.CharField(max_length=100)
text = forms.CharField(widget=forms.Textarea)
# Empty form
form = CommentForm()
print(form.is_bound)
Результат выполнения кода:
"False"
Пример
Теперь создадим форму с переданными данными и проверим атрибут:
from django import forms
class CommentForm(forms.Form):
author = forms.CharField(max_length=100)
text = forms.CharField(widget=forms.Textarea)
# Bound form
data = {
"author": "john_doe",
"text": "This is a great article!"
}
form = CommentForm(data)
print(form.is_bound)
Результат выполнения кода:
"True"
Пример
Использование is_bound в представлении для проверки состояния формы:
from django.shortcuts import render
from django.http import HttpResponseRedirect
from .forms import CommentForm
def comment_create(request):
if request.method == "POST":
form = CommentForm(request.POST)
if form.is_bound:
if form.is_valid():
# Process valid form data
return HttpResponseRedirect("/success/")
else:
form = CommentForm()
return render(request, "comment.html", {"form": form})
Результат выполнения кода при GET-запросе:
"Unbound form instance"
Результат выполнения кода при POST-запросе:
"Bound form instance"
Пример
Использование is_bound в шаблоне для условного отображения:
<form method="post">
{% csrf_token %}
{{ form.as_p }}
{% if form.is_bound %}
<p class="alert">Форма была отправлена</p>
{% else %}
<p class="info">Заполните форму</p>
{% endif %}
<button type="submit">Отправить</button>
</form>
Результат выполнения кода при первой загрузке страницы:
<div class="info">Заполните форму</div>
Результат выполнения кода после отправки формы:
<div class="alert">Форма была отправлена</div>
Пример
Практическое использование is_bound для управления логикой валидации:
from django import forms
class LoginForm(forms.Form):
username = forms.CharField(max_length=150)
password = forms.CharField(widget=forms.PasswordInput)
def clean(self):
cleaned_data = super().clean()
if self.is_bound:
# Additional validation only for bound forms
username = cleaned_data.get("username")
password = cleaned_data.get("password")
if username and password:
if len(password) < 8:
raise forms.ValidationError(
"Password must be at least 8 characters long"
)
return cleaned_data
# Bound form with validation
data = {
"username": "admin",
"password": "short"
}
form = LoginForm(data)
print(form.is_bound)
print(form.is_valid())
print(form.errors)
Результат выполнения кода:
"True"
"False"
"{'__all__': ['Password must be at least 8 characters long']}"
Смотрите также
-
метод
is_valid,
который проверяет валидность данных связанной формы -
атрибут
cleaned_data,
который содержит очищенные данные формы -
атрибут
errors,
который содержит словарь ошибок валидации -
атрибут
initial,
который определяет начальные значения полей формы