Метод hidden_fields
Метод hidden_fields применяется к объекту формы и возвращает список всех скрытых полей формы в виде объектов BoundField. Скрытые поля определяются как поля, для которых используется виджет HiddenInput или его наследники. Метод удобно использовать при ручной генерации HTML-кода формы для раздельной обработки скрытых и видимых полей.
Метод не принимает никаких аргументов и всегда возвращает список, даже если в форме нет скрытых полей. В этом случае возвращается пустой список. Метод полезен при создании кастомизированных шаблонов форм, где требуется контролировать порядок отображения полей.
Синтаксис
form.hidden_fields()
Пример
Рассмотрим простую форму с явным скрытым полем:
from django import forms
class ArticleForm(forms.Form):
title = forms.CharField(max_length=100)
content = forms.CharField(widget=forms.Textarea)
user_id = forms.IntegerField(widget=forms.HiddenInput)
status = forms.CharField(widget=forms.HiddenInput, initial='draft')
def clean_title(self):
data = self.cleaned_data['title']
if len(data) < 3:
raise forms.ValidationError('Title is too short')
return data
Теперь создадим экземпляр формы и вызовем метод hidden_fields:
from myapp.forms import ArticleForm
form = ArticleForm()
hidden_fields = form.hidden_fields()
for field in hidden_fields:
print(field.name)
Результат выполнения кода:
"user_id"
"status"
Пример
Рассмотрим пример использования метода в шаблоне для ручной генерации формы:
from django import forms
class ProfileForm(forms.Form):
username = forms.CharField(max_length=50)
email = forms.EmailField()
user_id = forms.IntegerField(widget=forms.HiddenInput)
referrer = forms.CharField(widget=forms.HiddenInput, required=False)
def clean_username(self):
data = self.cleaned_data['username']
if ' ' in data:
raise forms.ValidationError('Username cannot contain spaces')
return data
Создадим форму с данными и проверим работу метода:
from myapp.forms import ProfileForm
data = {
'username': 'john_doe',
'email': 'john@example.com',
'user_id': 42,
'referrer': 'newsletter'
}
form = ProfileForm(data)
if form.is_valid():
hidden_fields = form.hidden_fields()
for field in hidden_fields:
print(f"{field.name}: {field.value()}")
Результат выполнения кода:
"user_id: 42"
"referrer: newsletter"
Пример
Метод hidden_fields часто используется в паре с методом visible_fields для разделения полей при генерации HTML:
from django import forms
from django.shortcuts import render
from myapp.forms import ProfileForm
def profile_view(request):
form = ProfileForm()
hidden_fields = form.hidden_fields()
visible_fields = form.visible_fields()
return render(request, 'profile.html', {
'form': form,
'hidden_fields': hidden_fields,
'visible_fields': visible_fields
})
В шаблоне можно использовать полученные списки для раздельной отрисовки:
{# profile.html #}
{% for field in visible_fields %}
<div class="form-group">
{{ field.label_tag }}
{{ field }}
</div>
{% endfor %}
{# hidden fields #}
{% for field in hidden_fields %}
{{ field }}
{% endfor %}
Смотрите также
-
метод
visible_fields,
который возвращает список видимых полей формы -
метод
as_p,
который выводит форму в виде тегов<p> -
метод
is_bound,
который проверяет, привязана ли форма к данным -
метод
as_div,
который выводит форму в виде тегов<div>