【问题标题】:Django UpdateView CheckboxSelectMultiple - How do I load an object's ManyToMany field in CheckboxSelectMultiple?Django UpdateView CheckboxSelectMultiple - 如何在 CheckboxSelectMultiple 中加载对象的 ManyToMany 字段?
【发布时间】:2020-11-04 09:39:29
【问题描述】:

我的 UpdateView 来自一个 ModelForm,其中 sport_prefs 字段作为 CheckboxSelectMultiple 加载。表单正确加载并成功向 MemberRecord 模型提交数据。

我的问题出在 UpdateView 中,尽管 sport_prefs 字段显示为复选框,但它不会加载当前对象 sport_prefs 字段的数据。复选框加载为空白,虽然我可以选择选项并且它将正确更新和保存,但我无法加载第一次创建或上次更新时的 sport_prefs 数据。

models.py

class SportOptions(models.Model):
    sport_name = models.CharField(max_length=200)

class MemberRecord(models.Model):
    name = models.ForeignKey(ContactInfo, on_delete=models.PROTECT)
    age = models.IntegerField()
    join_date = models.DateField(default=timezone.now)
    sport_prefs = models.ManyToManyField(SportOptions)
    notes = models.TextField(blank=True)
    author = models.ForeignKey(User, on_delete=models.PROTECT)

forms.py

class createForm(ModelForm):
    sport_preference = forms.ModelMultipleChoiceField(
                queryset=SportOptions.objects.filter(),
                widget=forms.CheckboxSelectMultiple
            )

    class Meta:
        model = MemberRecord
        fields = [
            'name',
            'age',
            'join_date',
            'sport_preference',
            'notes'
        ]

我的猜测是我创建了一个新的 CheckboxSelectMultiple 字段并加载了正确的选项,因为我从 SportOptions 模型中绘制,但我没有从特定对象的 sport_prefs 中绘制。当我将 ModelForm 'sport_preference' 更改回 'sport_prefs' 时,这显示正确,因为它正确加载了数据,但它没有作为 CheckBoxSelectMultiple 加载。如果我想将数据加载为复选框,我猜我需要通过 sport_preference 中的查询集过滤器传递对象 ID?如果是这样,我该怎么做?

【问题讨论】:

  • 字段名是sport_prefs,所以你应该使用那个字段名。
  • @WillemVanOnsem 感谢您的回答!我如何将该字段显示为 CheckBoxSelectMultiple?EDIT-NVM 我在另一篇文章中看到了您的回复,谢谢!!

标签: django


【解决方案1】:

字段名是sport_prefs,所以你应该使用那个字段名。如果你想使用不同的标签,你可以指定一个label=… parameter [Django-doc]

class createForm(ModelForm):
    sport_prefs = forms.ModelMultipleChoiceField(
        label='Sport preferences',
        queryset=SportOptions.objects.all(),
        widget=forms.CheckboxSelectMultiple()
    )

    class Meta:
        model = MemberRecord
        fields = [
            'name',
            'age',
            'join_date',
            'sport_prefs',
            'notes'
        ]

【讨论】:

  • 谢谢!我怎样才能将 sport_prefs 字段显示为 CheckboxSelectMultiple 呢?因为默认的 ManyToMany 字段显示为多选,我更喜欢复选框!
  • @jonayoung:你保留widget=forms.CheckboxSelectMultiple
  • @jonayoung:问题不在于小部件,而在于您的字段名称没有映射到模型字段的名称。
  • 抱歉,我重新阅读了您的回复。我改变了你的解释,它的工作原理。非常感谢威廉!!
猜你喜欢
  • 2018-10-18
  • 2013-03-31
  • 2013-10-20
  • 2020-12-03
  • 2011-07-09
  • 2012-04-06
  • 2012-03-19
  • 2014-09-29
  • 2012-12-03
相关资源
最近更新 更多