如何在Select小部件中使用模型对象构造Django表单?

时间:2010-03-31 19:54:53

标签: django

假设我正在使用Django Site模型:

class Site(models.Model):
    name = models.CharField(max_length=50)

我的网站值为(键,值):

1. Stackoverflow
2. Serverfault
3. Superuser

我想使用带有上述值的html select小部件构建一个表单:

<select>
    <option value="1">Stackoverflow</option>
    <option value="2">Serverfault</option>
    <option value="3">Superuser</option>
</select>

我正在考虑从以下代码开始,但它不完整:

class SiteForm(forms.Form):
    site = forms.IntegerField(widget=forms.Select())

我是如何用Django形式实现的?

修改

不同的网页会显示不同的网站值。开发页面将显示开发站点,而烹饪页面将显示配方站点。我基本上想要根据视图动态填充窗口小部件选项。我相信我现在可以通过在模板中手动生成html来实现这一目标。

2 个答案:

答案 0 :(得分:12)

我没有对此进行过测试,但我正在思考......

site = forms.IntegerField(
    widget=forms.Select(
        choices=Site.objects.all().values_list('id', 'name')
        )
     )

编辑 -

我刚尝试了这个,它确实正确地生成了选择。 choices参数期待这样的2元组列表...

(
   (1, 'stackoverflow'),
   (2, 'superuser'),
   (value, name),
)

.values_list将返回确切的格式,前提是您拥有ID和名称/标题/其他内容:.values_list('id', 'name')。保存表单后,.site的值将为所选网站的ID / pk。

答案 1 :(得分:11)

我认为你正在寻找ModelChoiceField

更新:特别注意queryset参数。在支持页面的视图中,您可以根据您关注的任何条件更改您提供的QuerySet