Поля формы Django не отображаются при группировке полей
Я использую Django 4.0.3 с веб-интерфейсом на bootstrap. По причинам компоновки я хочу, чтобы мои поля в ModelForm были сгруппированы, и я делаю это с помощью:
class UserForm(ModelForm):
template_name = "container/form.html"
field_groups = [["email", "company"], ["last_name", "first_name"]]
grouped_fields = []
class Meta:
model = MyUser
fields = ["email", "company", "first_name", "last_name"]
__init__(self, *args, **kwargs):
super(UserForm, self).__init__(*args, **kwargs)
def group_fields(self):
for group in self._field_groups:
group_entry = []
for entry in group:
group_entry.append(self.fields[entry])
self.grouped_fields.append(group_entry)
В представлении я инициализирую свою форму и перегруппировываю поля:
def user_form(request):
form = UserForm()
form.group_fields()
render(request, "page.html, {"form", form})
page.html выглядит следующим образом:
<body>
<div id="form-wrapper">
{{ form }}
</div>
</body>
а form.html выглядит следующим образом:
<form action="" method="POST">{% csrf_token %}
{% for field_group in form.grouped_fields %}
<div class="row">
{% for field in field_group %}
<div class="col">
<label>{{ field.label }}</label> {{ field }}
</div>
{% endfor %}
</div>
{% endfor %}
Однако отображаемые поля отображаются как строковые представления объектов поля:
Email <django.forms.fields.EmailField object at 0x7f98c00e03a0>
Company <django.forms.fields.CharField object at 0x7f98c00e0250>
Last name <django.forms.fields.CharField object at 0x7f98c00e0790>
First name <django.forms.fields.CharField object at 0x7f98c00e10c0>
В то время как обычный вызов отображает, как ожидается, форму с полями ввода, но не с желаемым макетом.
{% for field in form %}
<div class="row">
<div class="col">
{{ field.label_tag }} {{ field }}
</div>
</div>
{% endfor %}
Я также пытался перенести вызов метода group_fields в форму init, но безуспешно.
Есть ли способ правильно отобразить поля, которые хранятся в моем контейнере grouped_fields?
После долгого перебора я написал обертку для ModelForm, определил в ней свой field_groups и отобразил его в шаблоне.
Это не очень красиво, но помогает.
<form action="" method="post">
{% for fieldgroup in form.field_groups %}
<div class="row fieldgroup">
{% for fieldname in fieldgroup %}
{% for field in form %}
{% if field.name == fieldname %}
<div class="col pt-2">
<label class="form-label">{{ field.label }}</label>
{{ field }}
</div>
{% endif %}
{% endfor %}
{% endfor %}
</div>
{% endfor %}
<button type="submit">Submit</button>
</form>