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

Thi*_*Lam 13 django

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

class Site(models.Model):
    name = models.CharField(max_length=50)
Run Code Online (Sandbox Code Playgroud)

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

1. Stackoverflow
2. Serverfault
3. Superuser
Run Code Online (Sandbox Code Playgroud)

我想构建一个带有以上值的html选择小部件的表单:

<select>
    <option value="1">Stackoverflow</option>
    <option value="2">Serverfault</option>
    <option value="3">Superuser</option>
</select>
Run Code Online (Sandbox Code Playgroud)

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

class SiteForm(forms.Form):
    site = forms.IntegerField(widget=forms.Select())
Run Code Online (Sandbox Code Playgroud)

有关Django表单如何实现这一点的任何想法?

编辑

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

Han*_*Gay 13

我想你在找ModelChoiceField.

更新:特别注意这个queryset论点.在支持页面的视图中,您可以QuerySet根据您关注的任何条件更改您提供的内容.


T. *_*one 12

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

site = forms.IntegerField(
    widget=forms.Select(
        choices=Site.objects.all().values_list('id', 'name')
        )
     )
Run Code Online (Sandbox Code Playgroud)

编辑 -

我只是尝试了这一点,它确实正确地生成了选择.这个choices论点是期待像这样的2元组列表......

(
   (1, 'stackoverflow'),
   (2, 'superuser'),
   (value, name),
)
Run Code Online (Sandbox Code Playgroud)

.values_list将返回只要你有ID和名称/标题/无论作为,因此精确的格式: .values_list('id', 'name').保存表单时,值.site将是所选站点的id/pk.