我有一个表格(为简洁而编辑)如下:
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.RadioInput
,forms.widgets.RadioFieldRenderer
和forms.widgets.RadioSelect
中的某些方法。我会深入研究这个。
答案 0 :(得分:1)
我想出了一个解决这个问题的解决方案。至少可以说,这是一种hackish,但这是迄今为止唯一可行的方法,而且对我现有的设计没有太多的后端更改。
我的方法源于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
字符串的逻辑 - 其值最终由 unicode 返回的字符串决定InteractionChoice
中的方法 - 返回的<label>
标记字符串。
对于自定义的RadioFieldRenderer类,我重写了__iter__
和__getitem__
以使用自定义的RadioInput类。
对于自定义RadioSelect类,我覆盖了renderer
属性以使用我的自定义无线电场渲染器。
这显然远非理想的解决方案。希望会出现一个更好的。
答案 1 :(得分:1)
答案 2 :(得分:0)
您应该继承ModelChoiceField并覆盖label_from_instance。它在这里说:https://docs.djangoproject.com/en/dev/ref/forms/fields/#modelchoicefield:
将调用模型的 unicode 方法,以生成对象的字符串表示形式,以便在字段的选择中使用;提供自定义表示,子类ModelChoiceField和覆盖label_from_instance。此方法将接收模型对象,并应返回适合表示它的字符串。