【问题标题】:Django - How to iterate and inspect each choice for a ModelChoiceField in the template codeDjango - 如何在模板代码中迭代和检查 ModelChoiceField 的每个选择
【发布时间】:2011-11-05 13:54:09
【问题描述】:

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

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

我的问题是,是否有一种方法可以遍历我的模板中的每个选项并访问它的一个属性——特别是在InteractionChoice 中定义的is_answer 属性。目的是自定义如果确实是答案,选择如何显示。更具体地说,如果 is_answer 为 True,我可能会更改 <label> 上的 class 属性以进行该选择。

也许,我是从错误的方向来解决这个问题的。如果有人有其他想法的建议,我很乐意听到。

提前致谢。

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

【问题讨论】:

    标签: django django-templates django-forms


    【解决方案1】:

    我想出了一个解决这个问题的解决方案。至少可以这么说,这有点骇人听闻,但这是迄今为止我想到的唯一可行的方法,而无需对我现有的设计进行大量后端更改。

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

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

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

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

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

    对于自定义 RadioFieldRenderer 类,我覆盖了 __iter____getitem__ 以使用自定义 RadioInput 类。

    对于自定义 RadioSelect 类,我覆盖了 renderer 属性以使用我的自定义单选字段渲染器。

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

    【讨论】:

      【解决方案2】:

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

      How to get ModelChoiceField instances in the template

      遍历字段的查询集属性。

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

        • 感谢您的回复,rczajka。但是,这只改变了标签的字符串值,这不是我想要的。我的问题应该更具体一点,因为我不想修改显示给用户的字符串,但最终会更改
        猜你喜欢
        • 1970-01-01
        • 2010-10-24
        • 2018-01-20
        • 2019-09-14
        • 2023-01-11
        • 2019-02-05
        • 1970-01-01
        • 2015-12-10
        相关资源
        最近更新 更多