【问题标题】:ModelForm in template with a grouped choice field带有分组选择字段的模板中的 ModelForm
【发布时间】:2012-01-18 14:56:22
【问题描述】:

我有一个分组的类别字段。问题是我创建了一个搜索表单,但是当我尝试在模板中将表单呈现给用户时,它出错了。

models.py

MEDIA_CHOICES = (
    ('Audio', (
        ('vinyl', 'Vinyl'),
        ('cd', 'CD'),
    )
    ),
    ('Video', (
        ('vhs', 'VHS Tape'),
        ('dvd', 'DVD'),
    )
    ),
    ('unknown', 'Unknown'),
)

category = models.CharField(max_length=20, choices=MEDIA_CHOICES, verbose_name=_(u'Category'))

forms.py(搜索)

class SearchingForm(forms.Form):

    "Search Box"
    search = forms.CharField(max_length=100, required=False, label=(_(u'Search')))

    music_kind = forms.MultipleChoiceField(choices=MEDIA_CHOICES, required=False,
                                        label=(_(u'Kind')),    
                                        widget=forms.CheckboxSelectMultiple(),
                                        )

模板.html

    {{ form.search }}
    {{ form.place_kind }}

我像这样向用户显示表单,问题是当我使用浏览器呈现时,我有这样的东西(在每一行,它都有一个复选框):

(('vinyl', 'Vinyl'), ('cd', 'CD'))
(('vhs', 'VHS Tape'), ('dvd', 'DVD'))
Unknown

我删除了 'widget=forms.CheckboxSelectMultiple()' 属性,但我没有复选框。那么,我该如何使用复选框字段呢?

【问题讨论】:

    标签: django django-models django-forms django-templates


    【解决方案1】:

    我认为您的数据类型不匹配。您希望在单个 CharField 中存储多个值。当然,您可以在其中保存一个键值对字典,但随后您必须将其解析回选择,这是一个巨大的痛苦。

    我会将您的 MEDIA_CHOICES 移动到数据库表中,然后在您的 SearchingForm 中,您可以执行 CheckboxSelectMultiple,表单将按预期运行。

    【讨论】:

    • 这是个好主意,但我如何从数据库中恢复数据。这应该在视图中作为对数据库的查询来完成吗?
    • 您需要使用 ModelMultipleChoiceField,它有一个 queryset 属性来保存选择。然后您可以使用 CheckboxSelectMultiple 覆盖小部件。
    【解决方案2】:

    我不确定,但我想知道选择组是否仅适用于选择框(而不是复选框)。

    【讨论】:

    • 是的,仅适用于选择框,但我正在尝试重用代码。在这种情况下,我应该重写另一个选择字段。
    猜你喜欢
    • 2021-04-01
    • 2019-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-07
    • 2011-01-14
    • 1970-01-01
    • 2018-02-25
    相关资源
    最近更新 更多