Oto istotne pytanie: Django and Fieldsets on Modelform, ale wydaje się to nieco przesadzone z tego, co chcę osiągnąć. Jest jeszcze jeden możliwy hack, chociaż jestem ciekawy, jak eksperci Django rozwiązują ten problem.
(0) zdefiniować obiekt pyton fieldset że jest iterable więc możemy iteracyjne nad nim w szablonie django:
from django.forms.forms import BoundField
class FieldSet(object):
def __init__(self,form,fields,legend='',cls=None):
self.form = form
self.legend = legend
self.fields = fields
self.cls = cls
def __iter__(self):
for name in self.fields:
field = self.form.fields[name]
yield BoundField(self.form, field, name)
(1) W zastosowaniu Widok:
fieldsets = (FieldSet(form_object, ('field_name1','field_name2'),
legend='Div env 1',
cls="class1"),
FieldSet(form_object, ('field_name3','field_name4'),
legend="Div env 2",
cls="class2"))
return render_to_response('my_form.html',
{'form': form_object,'fieldsets':fieldsets},
context_instance=RequestContext(request))
(2) teraz w szablonie zrobić:
{% for set in fieldsets %}
<fieldset{% if set.cls %} class="{{ set.cls }}"{% endif %}>
<legend>{{ set.legend }}</legend>
{% for field in set %}
{{ field.label}} : {{ field }}
{% endfor %}
</fieldset>
{% endfor %}
Należy zauważyć, że możliwe jest zastąpienie Wi fieldset
tag th a div
tag, aby odpowiedzieć na moje konkretne pytanie.
+++ Znaczna część tej odpowiedzi została wyodrębniona z this blog post by Michael Kowalchik. +++
Podoba mi się użycie tagu przegrupowania --- Nie wiedziałem, że to istnieje. Dzięki! –
Uwaga: twoje pierwsze rozwiązanie nie działa w pętli nad polami w szablonie --- użyj słowa kluczowego 'yield' do stworzenia generatora, aby uzyskać oczekiwane pola (zobacz mój post poniżej) i emuluj typowe iteracje pola Django –
@ C.Wiesz, masz rację, zapomniałem wrócić BoundFields. Zaktualizowano. Dzięki za uwagę! –