2012-04-28 41 views
6

Giả sử tôi có một biểu mẫu với 20 trường và tôi muốn đặt 10 trường này (nhóm1) vào một môi trường div cụ thể và 10 trường khác (nhóm 2) trong một môi trường div khác. Một cái gì đó như:Nhóm trường biểu mẫu Django

<div class="class1"> 
{% for field in form.group1 %} 
      {{ field.label}}: {{ field }} 
{% endfor %} 
</div> 

<div class="class2"> 
{% for field in form.group2 %} 
      {{ field.label}}: {{ field }} 
{% endfor %} 
</div> 

Bất kỳ ý tưởng nào về cách tôi có thể thực hiện việc này bằng cách lặp qua các trường? Nói chung, tôi muốn có thể làm điều này với nhiều môi trường div khác nhau và tập hợp các trường biểu mẫu.

Trả lời

13

Bất kỳ cách logic nào cho các trường nhóm sẽ hoạt động ... giả sử bạn có một phương thức trên biểu mẫu trả về các trường biểu mẫu mà bạn nhóm một cách rõ ràng?

Để lưu nhập, có lẽ một sơ đồ đặt tên tiền tố trường nhất định?

class MyForm(forms.Form): 
    group1_field = forms.CharField() 
    group1_field = forms.CharField() 
    group2_field = forms.CharField() 
    group2_field = forms.CharField() 

    def group1(self): 
     return [self[name] for name in filter(lambda x: x.startswith('group1_'), self.fields.values()] 

Có thể đặt thuộc tính trên trường bạn có thể lọc theo?

class MyForm(forms.Form): 
    field = forms.CharField() 
    field.group = 1 

    field2 = forms.CharField() 
    field2.group = 2 

    def group1(self): 
     return filter(lambda x: x.group == 1, self.fields.values()) 

    def group2(self): 
     return filter(lambda x: x.group == 2, self.fields.values()) 

Bạn cũng có thể sử dụng thẻ nhóm nếu bạn đặt các thuộc tính này.

{% regroup form.fields by group as field_group %} 
{% for group in field_group %} 
<div class="group_{{ group.grouper }}"> 
    {% for field in group.list %} 
    {{ field }} 
    {% endfor %} 
</div> 
{% endfor %} 
+0

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! –

+0

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 –

+0

@ C.Reed, bạn nói đúng Tôi quên trả lại BoundFields. Đã cập nhật. Cảm ơn vì đã chú ý! –

4

Đâ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. +++

+0

'yield self.form [name]' là đủ. (Tôi đã có vấn đề nhập khẩu BoundField nhưng với dòng đó nó thậm chí không cần thiết.) – Risadinha

Các vấn đề liên quan