2012-04-19 33 views
17

Nếu tôi có một mô hình có chứa một ChoiceField với một widget RadioSelect, làm cách nào tôi có thể hiển thị riêng các nút radio trong một mẫu?Làm cách nào để hiển thị các lựa chọn nút radio riêng lẻ trong Django?

Giả sử tôi đang xây dựng một ứng dụng web cho phép nhân viên mới tại một công ty chọn loại máy tính họ muốn trên máy tính để bàn của họ. Đây là mô hình có liên quan:

class ComputerOrder(forms.Form): 
    name = forms.CharField(max_length=50) 
    office_address = forms.Charfield(max_length=75) 
    pc_type = forms.ChoiceField(widget=RadioSelect(), choices=[(1, 'Mac'), (2, 'PC')]) 

Trên mẫu, làm thế nào để làm cho chỉ nút Mac lựa chọn? Nếu tôi làm điều này, nó ám tất cả các lựa chọn:

{{ form.pc_type }} 

Hơi ngây thơ tôi đã cố gắng này, nhưng nó được sản xuất không có đầu ra:

{{ form.pc_type.0 }} 

(Tôi tìm thấy một vài câu hỏi tương tự ở đây trên SO:

In a Django form, how do I render a radio button so that the choices are separated on the page?
Django Forms: How to iterate over a Choices of a field in Django form

Nhưng tôi không cảm thấy như họ đã có câu trả lời tốt. có cách nào để tái surrect câu hỏi cũ?)

Trả lời

40

Django 1.4+ allows you to iterate qua những lựa chọn trong một RadioSelect, dọc theo dòng của

{% for choice in form.pc_type %} 
    {{ choice.choice_label }} 
    <span class="radio">{{ choice.tag }}</span> 
{% endfor %} 

Tôi không chắc chắn nếu sự thay đổi này cho phép bạn sử dụng cú pháp bạn mô tả ({{ form.pc_type.0 }}) - nếu không, bạn có thể làm việc xung quanh giới hạn này với vòng lặp for ở trên và một thẻ như {% if forloop.counter0 == 0 %}.

Nếu bạn bị ràng buộc với Django < 1.4, bạn có thể ghi đè phương pháp render() như được đề xuất hoặc đi với tùy chọn hơi phức tạp hơn nhưng ít phức tạp hơn khi tự xây dựng trường biểu mẫu trong mẫu :

{% for choice in form.pc_type.field.choices %} 
    <input name='{{ form.pc_type.name }}' 
    id='{{ form.pc_type.auto_id }}_{{ forloop.counter0 }}' type='radio' value='{{ choice.0 }}' 
    {% if not form.is_bound %}{% ifequal form.pc_type.field.initial choice.0 %} checked='checked' {% endifequal %} 
    {% else %}{% ifequal form.pc_type.data choice.0 %} checked='checked' {% endifequal %}{% endif %}/> 
    <label for='{{ form.pc_type.auto_id }}_{{ forloop.counter0 }}'>{{ choice.1 }}</label> 
{% endfor %} 

(choice.0choice.1 là mục đầu tiên và thứ hai trong bạn choices hai tuple)

+0

{{} choice.1 cần phải được {{}} choice.1 tuyệt vời giải pháp: D – Sirion

+1

Cảm ơn bạn đã sửa chữa!Hãy nhớ rằng bạn luôn có thể trực tiếp đề xuất chỉnh sửa bằng cách nhấp vào "chỉnh sửa" trong câu trả lời của ai đó :) – supervacuo

5

Việc hiển thị các đầu vào radio riêng lẻ được xử lý theo phương pháp RadioSelect của tiện ích render. Nếu bạn muốn hiển thị khác, phân lớp RadioSelect, hãy thay đổi phương thức render cho phù hợp và sau đó sử dụng phân lớp của bạn làm tiện ích con của trường.

4

tôi nghĩ rằng chỉ đơn giản là nhìn vào những gì có sẵn bên trong vòng lặp for của một trường lựa chọn sẽ cho một những gì họ cần phải biết. Ví dụ, tôi cần giá trị để thiết lập một lớp bao quanh khoảng thời gian tùy chọn (đối với màu sắc và như vậy):

<div> 
    {% for radio_input in form.role %} 
     {# Skip the empty value #} 
     {% if radio_input.choice_value %} 
      <span class="user-level {{ radio_input.choice_value }}">{{ radio_input }}</span> 
     {% endif %} 
    {% endfor %} 
</div> 

Có một số thuộc tính như bạn có thể thấy rằng giữ cho bạn khỏi phải sử dụng thứ tự.

PyCharm Debugging Inside a Template

+0

@Emily - Đây là ảnh chụp màn hình của [PyCharm] (https://www.jetbrains.com/pycharm/) – Freddie

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