如何在Django模板中设置Radio Widget的Choice值?

时间:2019-05-30 12:01:38

标签: django-templates

我想根据小部件选择(即,forms.py中的value)设置我的每个单选按钮option.pk{{ radio.id }}当前不产生任何内容。如何使用Django的模板标签设置每个值?

丹尼尔·罗斯曼(Daniel Roseman)的答案像往常一样(Get the selected radio button in django template)很有帮助,并且比文档(https://docs.djangoproject.com/en/2.2/ref/forms/widgets/)提供了更多信息。 但是,我不确定如何设置该值。

模板

{% for form in formset.forms %}
            <div>
                <div>
                {% for radio in form.selected_options %}
                    {{ radio.id }}
                    <label for="{{ radio.id_for_label }}">
                    <input type="radio" id="{{ radio.id_for_label }}" value="{{ radio.id }}">
                        {{ radio.choice_label }}
                    </label>
                {% endfor %}

forms.py

class QuestionForm(forms.ModelForm):
    class Meta:
        model = Question
        fields = ('question_text',)
        labels = {'question_text': ''}

    def __init__(self, *args, **kwargs):
        super(QuestionForm, self).__init__(*args, **kwargs)
        OPTIONS = [
            (f'{option.pk}', f'{option}')
            for option in Option.objects.filter(question_id=self.instance.pk)
        ]
        self.fields['selected_option'] = forms.ChoiceField(
            choices=OPTIONS,
            required=True,
            widget=RadioSelect(),
            error_messages={
                'required': 'The question form lacks a selected option'
            },
        )

1 个答案:

答案 0 :(得分:1)

根据有关the testing of the above code的答案,除非产生了一些结果,否则将不会生成OPTIONS,除非在那里使用了查询集。

为实现此目的,我残酷地修改了查询,只是为了显示一个成功的场景:

        OPTIONS = [
            (f'{option.pk}', f'{option}')
            for option in Option.objects.all()
        ]

使用以下views.py:

from django.views.generic.edit import FormView
from my_app.forms import QuestionForm


class RadioView(FormView):
    template_name = "the/template.html"
    form_class = QuestionForm

以及以下template.html:

{% extends 'admin/index.html' %}

{% block content %}
  {{ form.as_p  }}
{% endblock %}

结果至少令人满意。

您可以将其扩展为使用窗体,或按照the docs中的说明手动呈现窗体。