gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 15:37:29 26 4
gpt4 key购买 nike

我有一个表格(为简洁起见进行了编辑)如下:

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 的实例从 View 传递到模板并通过以下方式呈现:

{{ form.choices }}

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

也许,我是从错误的方向来解决这个问题的。如果有人有替代想法的指示,我很乐意听取他们的意见。

提前致谢。

更新 1:在 @rczajka 的回复之后再考虑这个问题,我不相信我可以在模板代码中实现我希望做的事情。相反,如果目的是修改标签的类属性,我或许应该寻找子类并重写 forms.widgets.RadioInput 中的某些方法。 , forms.widgets.RadioFieldRenderer , 和 forms.widgets.RadioSelect .我将深入研究这一点。

最佳答案

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

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

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

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

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

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

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

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

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

关于Django - 如何迭代和检查模板代码中 ModelChoiceField 的每个选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7222910/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com