Đây là câu hỏi SO có liên quan: Django and Fieldsets on Modelform, mặc dù điều này có vẻ hơi quá mức đối với những gì tôi đang tìm kiếm để thực hiện. Ngoài ra, đây là một trong những hack có thể, mặc dù tôi rất tò mò muốn nghe cách các chuyên gia Django giải quyết vấn đề này.
(0) Xác định một đối tượng python fieldset đó là iterable vì vậy chúng tôi có thể lặp qua nó trong một mẫu 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) Trong việc sử dụng quan điểm:
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) Bây giờ trong mẫu làm:
{% 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 %}
Lưu ý rằng có thể thay thế thẻ fieldset
th một thẻ div
để giải quyết câu hỏi cụ thể của tôi.
+++ Phần lớn câu trả lời này được trích xuất từ this blog post by Michael Kowalchik. +++
Tôi thích việc sử dụng các thẻ regroup --- Tôi không biết điều này tồn tại. Cảm ơn! –
Lưu ý: giải pháp đầu tiên của bạn không hoàn toàn hoạt động để lặp qua các trường trong mẫu --- sử dụng từ khóa 'yield' để tạo trình tạo để có được trường mong đợi (xem bài đăng của tôi bên dưới) và mô phỏng lặp lại trường điển hình của django –
@ C.Reed, bạn nói đúng Tôi quên trả lại BoundFields. Đã cập nhật. Cảm ơn vì đã chú ý! –