2009-04-09 32 views
11

Tôi có một trường CheckboxSelectMultiple, tại sao tôi không thể lặp qua các lựa chọn đơn lẻ?Lặp lại các lựa chọn trong CheckboxSelectMultiple

này không hoạt động:

{%for choice in form.travels.choices%} 
    {{choice}} 
    {%endfor%} 

Thậm chí xác định {{choice.0}} không được, làm thế nào tôi có thể làm điều này?

Cảm ơn

Trả lời

29

Bên trong mẫu, các travels lĩnh vực như thực sự là một thể hiện của BoundField (mà là một đối tượng Django gắn kết lại với nhau các lĩnh vực và giá trị của nó cho rendering). Điều này có nghĩa là các thuộc tính có phần khác nhau.

Để lặp qua các lựa chọn như một tuple:

{% for choice in form.travels.field.choices %} 
    {{ choice }} - 
{% endfor %} 

Produces: (1, 'One') - (2, 'Two') - 

Để lặp qua các yếu tố trong các bộ lựa chọn riêng:

{% for choice_id, choice_label in form.travels.field.choices %} 
    {{ choice_id }} = {{ choice_label }} <br/> 
{% endfor %} 

Produces: 1 = One 
      2 = Two 

Hy vọng rằng sẽ giúp. Tuy nhiên, đã nói rằng, tôi không chắc chắn về bối cảnh mà bạn cần phải làm điều này; trên bề mặt, nó không có vẻ giống như django. Bạn có thể thấy rằng việc sử dụng trường biểu mẫu tùy chỉnh hoặc thẻ mẫu tùy chỉnh cung cấp cho bạn khả năng thực thi dễ sử dụng hơn, có thể tái sử dụng tốt hơn để duy trì sự tách biệt dự kiến ​​của django giữa mã xem và mã mẫu. Tất nhiên, YMMV và nó cũng có thể là cách tiếp cận lặp trực tiếp là thích hợp cho bạn trong trường hợp này.

+3

Tôi biết điều này là cũ, nhưng có cách nào để xác định xem trường đó có được chọn không? –

+0

Trước tiên, hãy cẩn thận khi sử dụng tiện ích tùy chỉnh, tùy chọn trường và tùy chọn tiện ích có thể không giống nhau. Vì vậy, bạn sẽ cần phải sử dụng "form.travels.field.widget.choices". –

+0

Thứ hai, để tùy chỉnh chọn nếu bạn đang sử dụng tiện ích radio, bạn sẽ cần phải kiểm tra từng giá trị so với giá trị trường và đặt đầu vào để kiểm tra khi chúng khớp nhau. Ví dụ: "{% if form.travels.value = choice_id%} checked =" checked "{% endif%}". –

0

nếu bạn có một Form.ModelForm với trường lựa chọn, bạn có thể chèn nó vào mẫu bằng một bộ lọc mẫu đơn giản.

forms.py

STATE_CHOICES = (
    (10, 'NO'), 
    (4, 'YES'), 
    (18, 'Send to another Chemist for Review'), 
    (34, 'Send to another Market Expert for Review'), 
    (20, 'HOLD'), 
) 
new_state = forms.ChoiceField(
    choices=STATE_CHOICES, 
    required=True, 
) 

mẫu:

{{ business_manager_form.new_state|filter_project_states:project }} 

và đây là bộ lọc nó tự.

@register.filter() 
def filter_project_states(argv, project): 
if project.department.id != 4: 
argv.field.choices = [choice for choice in argv.field.choices if choice[0] != 34] 
return argv 

Tôi hy vọng điều này sẽ hữu ích.

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