将数据绑定到django形式ChoiceField的渲染选项

时间:2011-08-25 17:09:32

标签: django django-templates django-forms

我有一个表单(由表单工厂生成),带有一个特殊字段

def MyFormGenerator(data):
    CHOICES = <created_using_data_value>
    class MyForm(form.Form):
        myfield = forms.ChoiceField(choices=CHOICES, widget=forms.RadioSelect)
    return MyForm

我需要做的是将一些python变量绑定到每个选项,以便模板可以在渲染时使用它们(每个选项将在div中显示有关该选项的详细信息)。

我可以想到两种方法来做到这一点。 (出于灵活性,首选#1) 1)为模板提供一个单独的列表,列出应该出现的字段(包含数据)并抓取模板并根据需要渲染每个字段。 2)将数据绑定到字段,以便模板可以在迭代时抓取并使用它。

几乎做#1(在模板中手动创建输入字段),但我无法弄清楚如何使用变量通过名称调出字段选项,因为它很难知道当_some_field_是模板变量时,什么不起作用。

现在我正在从模板中的SCRATCH重新创建字段(重新创建选择值等),但这远非理想。

2 个答案:

答案 0 :(得分:0)

请查看Django's MultipleModelChoiceField表单。

它允许您将另一个模型的查询集用作您的choice_fields。如果您的选择将会有如此多的数据,那么无论如何他们最好拥有自己的模型。 假设有某种方法可以查询要显示的结果,即使您为它们分配了一个整数字段以进行常见分组,也可以这样做。最糟糕的情况是,您只有一些巨大的查询(代码长度),包括许多排除,过滤器等等。

field1 = forms.MultipleModelChoiceField(queryset=MyModel.objects.filter(method="UPS"), empty_label="(None)")

它默认使用SelectMultiple小部件,但可以用kwarg覆盖它。

答案 1 :(得分:0)

我发现这样做的最简单方法是将数据附加到视图中而不是附加到选择字段本身。

例如,如果列表choices_data与您的选择长度相同,并且您希望将每个数据绑定到相应的选项,则可以执行以下操作。

def my_view(request):
    form = MyForm()
    myfield_choices = zip(form['myfield'], choices_data)
    ...

然后你可以像这样遍历模板中的选项:

{% for choice, data in myfield_choices %}
    ...
{% endfor %}