如何在 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
子类似乎相当简单,例如DeveloperSitesForm
、EndUserSitesForm
等。
我可以通过该问题中的代码做到这一点:***.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 小部件的搜索控件