Метод visible_fields
Метод visible_fields применяется к экземпляру формы и возвращает итератор, который перебирает все поля формы, кроме скрытых полей (полей с виджетом HiddenInput). Этот метод удобно использовать при ручной генерации HTML-разметки формы, когда нужно отобразить только видимые поля, оставляя скрытые поля для отображения отдельно с помощью метода hidden_fields. Метод не принимает никаких аргументов и возвращает объект генератора, который можно обойти в цикле.
Синтаксис
form.visible_fields()
Пример
Давайте создадим форму с обычными и скрытым полем и получим список видимых полей:
from django import forms
class UserForm(forms.Form):
username = forms.CharField(max_length=100)
email = forms.EmailField()
user_id = forms.IntegerField(widget=forms.HiddenInput)
form = UserForm()
visible = form.visible_fields()
for field in visible:
print(field.name)
Результат выполнения кода:
"username"
"email"
Пример
Рассмотрим пример ручного рендеринга полей формы с использованием visible_fields:
from django import forms
class OrderForm(forms.Form):
product_name = forms.CharField(label="Product", max_length=200)
quantity = forms.IntegerField(label="Quantity", min_value=1)
discount_code = forms.CharField(required=False, widget=forms.HiddenInput)
form = OrderForm()
res = ""
for field in form.visible_fields():
res += f"<div class='field'>"
res += f" <label>{field.label}</label>"
res += f" {field}"
res += f"</div>"
print(res)
Результат выполнения кода:
"<div class='field'> <label>Product</label> <input type='text' name='product_name' maxlength='200' required id='id_product_name'></div><div class='field'> <label>Quantity</label> <input type='number' name='quantity' min='1' required id='id_quantity'></div>"
Пример
Продемонстрируем, как visible_fields позволяет обрабатывать поля с ошибками валидации:
from django import forms
class ContactForm(forms.Form):
name = forms.CharField(max_length=50)
phone = forms.CharField()
message = forms.CharField(widget=forms.Textarea)
secret_token = forms.CharField(widget=forms.HiddenInput)
form = ContactForm({"name": "", "phone": "123", "message": "Hello"})
form.is_valid()
for field in form.visible_fields():
if field.errors:
print(f"Field {field.name} has errors: {field.errors}")
else:
print(f"Field {field.name} is valid")
Результат выполнения кода:
"Field name has errors: ['This field is required.']"
"Field phone has errors: ['Enter a valid value.']"
"Field message is valid"
Смотрите также
-
метод
hidden_fields,
который возвращает только скрытые поля формы -
метод
as_div,
который выводит форму в виде div-элементов -
метод
as_p,
который выводит поля формы в виде параграфов -
метод
fields,
который содержит все поля формы в виде словаря