2012-04-19 17 views
17

Wenn ich ein Modell mit einem ChoiceField mit einem RadioSelect-Widget habe, wie kann ich die Optionsfelder separat in einer Vorlage rendern?Wie man einzelne Auswahlknöpfe in Django rendert?

Nehmen wir an, ich baue eine Web-App, die es neuen Mitarbeitern in einem Unternehmen ermöglicht, die Art von Computer auszuwählen, die sie auf ihrem Desktop haben möchten. Dies ist das entsprechende Modell:

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')]) 

Auf der Vorlage, wie mache ich nur die Mac Wahl-Taste? Wenn ich das tue, macht es alle Möglichkeiten:

{{ form.pc_type }} 

Etwas naiv versuchte ich das, aber es erzeugt keine Ausgabe:

{{ form.pc_type.0 }} 

(fand ich ein paar ähnliche Fragen hier auf 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

Aber ich fühle mich nicht wie sie gute Antworten hatte. gibt es eine Möglichkeit, um wieder alte Fragen?)

Antwort

40

Django 1.4+ allows you to iterate über die Entscheidungen in einer RadioSelect, entlang der Linien von

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

Ich bin nicht sicher, ob diese Änderung die Syntax verwenden, können Sie ({{ form.pc_type.0 }}) beschreiben - nicht, wenn Sie könnte umgehen diese Einschränkung mit der for Schleife oben und ein Tag wie {% if forloop.counter0 == 0 %}. Wenn Sie an Django < 1.4 gebunden sind, können Sie entweder die render()-Methode wie vorgeschlagen außer Kraft setzen oder mit der etwas komplizierteren, aber weniger komplizierten Option, das Formularfeld selbst in der Vorlage zu erstellen, gehen :

{% 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.0 und choice.1 sind der erste und zweiter Artikel im choices zwei-fach)

+0

{{choice.1} muss {{}} choice.1 genial Lösung sein: D – Sirion

+1

Danke für die Korrektur!Denken Sie daran, dass Sie eine Änderung immer direkt vorschlagen können, indem Sie auf "Bearbeiten" unter der Antwort von jemandem klicken :) – supervacuo

5

Das Rendering der einzelnen Radio-Eingänge wird von RadioSelect Widget render Methode behandelt. Wenn Sie ein anderes Rendering wünschen, Unterklasse RadioSelect, ändern Sie die Methode render entsprechend und verwenden Sie dann Ihre Unterklasse als Widget des Feldes.

4

ich denke, die einfach auf der Suche, was für Schleife eines Auswahlfeldes wird man sagen, innerhalb der zur Verfügung steht, was sie muss es wissen. Zum Beispiel musste ich den Wert eine Klasse rund um die Spannweite der Option setzen (für Farben und so weiter):

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

Es gibt mehrere Attribute, wie Sie, dass Sie sehen können verhindern, mit der Ordnungszahl verwenden.

PyCharm Debugging Inside a Template

+0

@Emily - Dies ist ein Screenshot von [PyCharm] (https://www.jetbrains.com/pycharm/) – Freddie

Verwandte Themen