如何在 Select 小部件中构造带有模型对象的 Django 表单?

Posted

技术标签:

【中文标题】如何在 Select 小部件中构造带有模型对象的 Django 表单?【英文标题】:How do I construct a Django form with model objects in a Select widget? 【发布时间】:2011-02-03 02:30:17 【问题描述】:

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

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

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

1. ***
2. Serverfault
3. Superuser

我想用具有上述值的 html 选择小部件构造一个表单:

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

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

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

有什么想法可以用 Django 表单实现吗?

编辑

不同的页面会呈现不同的网站价值。开发页面将显示开发站点,而烹饪页面将显示食谱站点。我基本上想根据视图动态填充小部件选择。我相信我现在可以通过在模板中手动生成 html 来实现。

【问题讨论】:

【参考方案1】:

我想你正在寻找ModelChoiceField

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

【讨论】:

我可以在视图中指定查询集吗? 如,提供QuerySet 以在您实例化Form 时使用?我不知道。如果您的可能性有限,提供一个针对您正在使用的特定视图定制的Form 子类似乎相当简单,例如DeveloperSitesFormEndUserSitesForm 等。 我可以通过该问题中的代码做到这一点:***.com/questions/622982/…【参考方案2】:

我没有对此进行测试,但我正在考虑类似的事情......

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

编辑 --

我刚刚尝试过,它确实会正确生成选择。 choices 参数需要这样的 2 元组列表...

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

.values_list 将返回确切的格式,前提是您有 ID 和名称/标题/无论是什么:.values_list('id', 'name')。保存表单时,.site 的值将是所选站点的 id/pk。

【讨论】:

这将在首次定义表单时评估站点查询集。如果数据发生变化,表单将不会显示新数据。

以上是关于如何在 Select 小部件中构造带有模型对象的 Django 表单?的主要内容,如果未能解决你的问题,请参考以下文章

如何对 Django Select 小部件中的选择进行分组?

在 Yii2 Kartik Select2 小部件中,如何对选择事件进行 ajax 调用?

如何在 Yii 2.0.43 版和 bootstrap4 中启用 select2 小部件的搜索控件

<Select> 带有无限滚动下拉菜单的小部件

如何在无需重新定义整个表单的情况下使用带有通用 UpdateView 的自定义小部件?

Angular UI select2 指令 - 以编程方式更新模型未反映在小部件上