Как достать значение(value) из списка choices поля типа ChoicesField форми джанго в шаблоне джанго?

Рейтинг: 0Ответов: 2Опубликовано: 19.03.2023

У меня есть вот такая форма:

class ReviewForm(forms.ModelForm):
    user_name = forms.CharField(label='Your Name')
    text = forms.CharField(label='Your Review', widget=forms.Textarea(attrs={'style': 'width: 98%', 'row': 8}))
    rating = forms.ChoiceField(label='Rating', widget=forms.RadioSelect(attrs={'inline': True}), choices=(('1', 'Bad'),
                                                                                                          ('2', 'Poor'),
                                                                                                          ('3', 'Average'),
                                                                                                          ('4', 'Good'),
                                                                                                          ('5', 'Excellent'),
                                                                                                          ))
    
    class Meta:
        model = Review
        fields = ('user_name', 'text', 'rating')

В шаблоне джанго я её вот так рендерю:

<form action="{% url 'product-detail' object.slug %}" method="post">
    {% csrf_token %}
    <h2 class="s_title_1"><span class="s_main_color">Write</span> Review</h2>
    <div id="review_title" class="clear"></div>
    {% for field in form %}
        {% if field.name == 'rating' %}
            <div class="s_row_3 clearfix">
                <strong><label for="field.id_for_label">{{ field.label }}: </label></strong>
                {% for choice in field %}
                    <input type="radio" name="rating" value="{{ choice.choice_value }}"/>
                {% endfor %}
            <div/>
        {% else %}
        <div class="s_row_3 clearfix">
            <strong><label for="field.id_for_label">{{ field.label }}: </label></strong>
            {{ field }}
        </div>
        {% endif %}
    {% endfor %}
    <span class="clear border_ddd"></span>
    <button class="s_button_1 s_main_color_bgr"><span class="s_text">Continue</span></button>
    <span class="clear"></span>
</form>

И мне никак не удаётся подставить в атрибут тега инпут value значение из списка choices.

Я уже всячески пробовал и: (field.choices, потом choice.0), (choice.choice_value, и ничего не было, при том, что когда choice.choice_label, то выводило соответствующий лейбл).

Я заходил в shell и там экспериментировал, и все получалось, например, с помощью конструкции:

for choice in field.choices:
    print(choice[0])

и все работало - выводило соответствующие значения (1,2,3, тд.).

В шаблоне потом пробовал такое провернуть с помощью шаблонизатора джанго, но ничего не работает.

Ответы

▲ 0Принят

Нашёл решение -- этот код выводит теги input с нужными значениями:

{% for choice in field %}
    {{ choice.tag }}
{% endfor %}

Теперь вывод формы выглядит так:

<form action="{% url 'product-detail' object.slug %}" method="post">
    {% csrf_token %}
    <h2 class="s_title_1"><span class="s_main_color">Write</span> Review</h2>
    <div id="review_title" class="clear"></div>
        {% for field in form %}
            <div class="s_row_3 clearfix">
            <strong><label for="{{ field.id_for_label }}">{{ field.label }}: </label></strong>
            <span class="clear"></span>
            {% if field.name == 'rating' %}
                <span>Bad</span>
                {% for choice in field %}
                    {{ choice.tag }}
                {% endfor %}
                <span>Good</span>
            {% else %}
                {{ field }}
            {% endif %}
            </div>
        {% endfor %}
    <span class="clear border_ddd"></span>
    <button class="s_button_1 s_main_color_bgr"><span 
    class="s_text">Continue</span></button>
    <span class="clear"></span>
</form>
▲ 0

Попробуйте в шаблоне:

for choice in field.choices:
print(choice.0)