2016-08-03 23 views
1

tl; dr: Wie mache ich ein Formular die 'nette' Namen der Auswahl in einem Modell ausgeben?Django Rendering Anzeige Name der Wahl Feld in Form

Ich habe eine Django Modell mit Entscheidungen, die wie folgt definiert:

class City(models.Model): 
    AMSTERDAM = 'AMS' 
    ROTTERDAM = 'ROT' 
    THE_HAGUE = 'THE' 
    UTRECHT = 'UTR' 
    CITY_CHOICES = (
     (AMSTERDAM, 'Amsterdam'), 
     (ROTTERDAM, 'Rotterdam'), 
     (THE_HAGUE, 'The Hague'), 
     (UTRECHT, 'Utrecht'), 
    ) 
    name = models.CharField(
     max_length=3, 
     choices=CITY_CHOICES, 
     default=AMSTERDAM, 
     blank=False, 
    ) 

In forms.py werden die widgets wie folgt definiert:

class ArticleForm(ModelForm): 
    class Meta: 
     model = Article 
     fields = ['title', 'text', 'categories', 'city'] 
     widgets = {'title': forms.TextInput(attrs={ 
      'placeholder': 'Enter a descriptive title'}), 
      'text': forms.Textarea(attrs={'placeholder': 'The article'}), 
      'categories': forms.CheckboxSelectMultiple(), 
      'city': forms.RadioSelect(), 
     } 

Die Form selbst manuell gemacht wird (obwohl die gleiche Wirkung geschieht mit nur {{form}}:

<form action="{% url 'article-submit' %}" method="POST"> 
    {% csrf_token %} 
    {{% for field in form %} 
     <fieldset class="article-form__field"> 
     {% if field.name = "categories"%} 
      {{ field.label_tag }} 
      <ul id={{ field.auto_id }}> 
      {% for checkbox in field %} 
       <li> 
        <label for="{{ checkbox.id_for_label }}"> 
         {{ checkbox.choice_label }} 
        </label> 
        {{ checkbox.tag }} 
       </li> 
      {% endfor %} 
      </ul> 
     {% elif field.name = "city" %} 
      {{ field.label_tag }} 
      <ul id={{ field.auto_id }}> 
      {% for radio in field %} 
       <li> 
        <label for="{{ radio.id_for_label }}"> 
         {{ radio.choice_label }} 
        </label> 
        {{ radio.tag }} 
       </li> 
      {% endfor %} 
      </ul> 
     {% else %} 
      {{ field.label_tag }} {{ field }} 
     {% endif %} 
     </fieldset> 
    {% endfor %}} 
    <fieldset class="article-form__field"> 
     <input class="button" type="submit" value="submit"> 
    </fieldset> 
</form> 

jedoch t er Ausgang ist nicht Amsterdam, aber AMS:

 <fieldset class="article-form__field"> 

      <label for="city_0">City:</label> 
      <ul id=city> 

       <li> 
        <label for="city_0"> 
         --------- 
        </label> 
        <input checked="checked" id="city_0" name="city" type="radio" value="" /> 
       </li> 

       <li> 
        <label for="city_1"> 
         AMS 
        </label> 
        <input id="city_1" name="city" type="radio" value="1" /> 
       </li> 
etc. 

In anderen Vorlagen, könnte ich dies tun: {{city.get_name_display}}, um den vollständigen Namen zu bekommen. Wie mache ich das im Formular?

full code is here

Antwort

0

ich die following answer von reddit Benutzer roambe bekam:

Da Stadt ein Fremdschlüssel ist, verwendet Django die Methode __str__ (oder __unicode__) des Stadtmodells für das Auswahllabel. Dies sollte dazu führen, dass es sich so benimmt, wie Sie möchten (ersetzen Sie Unicode bei Bedarf):

def __str__(self): 
    return self.get_name_display() 
1

In Ihrer Linie 'city': forms.RadioSelect(),, müssen Sie die Entscheidungen für sie definieren. Es sollte wie folgt aussehen:

from blah.models import City 

class ArticleForm(ModelForm): 
    class Meta: 
     model = Article 
     fields = ['title', 'text', 'categories', 'city'] 
     widgets = {'title': forms.TextInput(attrs={ 
      'placeholder': 'Enter a descriptive title'}), 
      'text': forms.Textarea(attrs={'placeholder': 'The article'}), 
      'categories': forms.CheckboxSelectMultiple(), 
      'city': forms.RadioSelect(choices=City.CITY_CHOICES), 
     } 

Das Radio wählen Widget aus der Auswahl Widget erbt, die in der Dokumentation hier eine kurze Erwähnung der Wahl Argument hat: https://docs.djangoproject.com/en/1.10/ref/forms/widgets/#django.forms.Select

+0

Vielen Dank! Einige andere Leute haben gesagt, dass sie 'choices = CITY_CHOICES' setzen, aber das wirft einen Fehler auf. Das tut es nicht, das ist großartig. Die Ausgabe ist jedoch immer noch die gleiche. – Flobin

+0

Was ist, wenn Sie {{form}} verwenden? –

+0

dasselbe passiert, fürchte ich. – Flobin