Django - 如何在模板代码中迭代和检查ModelChoiceField的每个选项

时间:2011-08-28 18:15:17

标签: django django-templates django-forms

我有一个表格(为简洁而编辑)如下:

class InteractionForm(forms.Form):
    def __init__(self, *args, **kwargs):

        # Each object within this queryset is a model object of type InteractionChoice
        choices_qs = interaction.interactionchoice_set.all()

        self.fields['choices'] = forms.ModelChoiceField(
                                    widget=forms.RadioSelect(),
                                    queryset=choices_qs,

InteractionChoice模型如下:

class InteractionChoice(models.Model):
    interaction = models.ForeignKey(Interaction)
    name = models.CharField(max_length=255)
    is_answer = models.BooleanField(default=False)

InteractionForm的实例从视图传递到模板并通过以下方式呈现:

{{ form.choices }}

我的问题是,是否有办法迭代我的模板中的每个选项并访问其中一个属性 - 特别是is_answer中定义的InteractionChoice属性。目的是定制如何选择显示,如果它确实是答案。更具体地说,如果is_answer为True,我可能会针对该选择更改class上的<label>属性。

也许,我正在从错误的方向接近这个问题。如果有人有其他想法的指示,我会很高兴听到它们。

提前致谢。

更新1: 在@ rczajka的回复之后想到这一点,我不相信我能在模板代码中实现我希望做的事情。相反,如果目的是修改标签的类属性,我或许应该寻找子类并覆盖forms.widgets.RadioInputforms.widgets.RadioFieldRendererforms.widgets.RadioSelect中的某些方法。我会深入研究这个。

3 个答案:

答案 0 :(得分:1)

我想出了一个解决这个问题的解决方案。至少可以说,这是一种hackish,但这是迄今为止唯一可行的方法,而且对我现有的设计没有太多的后端更改。

我的方法源于this article子类化“RadioFieldRenderer”和“RadioSelect”。

__unicode__模型的InteractionChoice方法中,我返回:

return self.name + "_" + str(self.is_answer)

这是用于单选按钮标签的值(以及其他内容)。然后我将forms.widgets.RadioInputforms.widgets.RadioFieldRendererforms.widgets.RadioSelect子类化。

对于自定义的RadioInput类,我重写其__unicode__方法以包含附加class字符串的逻辑 - 其值最终由 unicode 返回的字符串决定InteractionChoice中的方法 - 返回的<label>标记字符串。

对于自定义的RadioFieldRenderer类,我重写了__iter____getitem__以使用自定义的RadioInput类。

对于自定义RadioSelect类,我覆盖了renderer属性以使用我的自定义无线电场渲染器。

这显然远非理想的解决方案。希望会出现一个更好的。

答案 1 :(得分:1)

我发现了一个类似的问题但是以不同的方式解决了它。

How to get ModelChoiceField instances in the template

迭代字段的queryset属性。

答案 2 :(得分:0)

您应该继承ModelChoiceField并覆盖label_from_instance。它在这里说:https://docs.djangoproject.com/en/dev/ref/forms/fields/#modelchoicefield

  

将调用模型的 unicode 方法,以生成对象的字符串表示形式,以便在字段的选择中使用;提供自定义表示,子类ModelChoiceField和覆盖label_from_instance。此方法将接收模型对象,并应返回适合表示它的字符串。