假设我正在使用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来实现这一目标。
答案 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
。