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

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

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

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

1. Stackoverflow
2. Serverfault
3. Superuser

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

<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 来实现。

【问题讨论】:

    标签: django


    【解决方案1】:

    我想你正在寻找ModelChoiceField

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

    【讨论】:

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

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

    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。

    【讨论】:

    • 这将在首次定义表单时评估站点查询集。如果数据发生变化,表单将不会显示新数据。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-18
    相关资源
    最近更新 更多