【问题标题】:Django: ValueError (must be a category instance) when saving a ModelMultipleChoiceField with CheckboxSelectMultiple based on a ForeignKey to my FormDjango:将基于 ForeignKey 的带有 CheckboxSelectMultiple 的 ModelMultipleChoiceField 保存到我的表单时出现 ValueError(必须是类别实例)
【发布时间】:2017-08-11 17:31:36
【问题描述】:

我收到 ValueError: Cannot assign "[Category: cat1],[Category: cat2] ": "ProfileUser.chosencategories" 必须是 "Category" 实例。尝试保存我的 ModelForm 时。

我的表格如下:

class ProfileUserForm(forms.ModelForm):

  class Meta:
        model = ProfileUser
        fields = ('field1', 'field2','field3','field4', 'chosencategories')


  chosencategories = forms.ModelMultipleChoiceField(
                                     widget=forms.CheckboxSelectMultiple,
                                     queryset=Category.objects.all(), to_field_name="name")

我的观点是:

@login_required
def create_user_profile(request):
    user = request.user
    if request.method=='POST':
        profile_user_form=ProfileUserForm(request.POST)
        if profile_user_form.is_valid():
            new_user_profile=profile_user_form.save(commit=False)
            new_user_profile.user=user
            new_user_profile.save()

            return render(request, 'accounts/user_profile_registered.html', 
                                    {'new_user_profile':new_user_profile})
    else:
        profile_user_form=ProfileUserForm()
        return render(request, 'accounts/create_user_profile.html', 
                                {'profile_user_form':profile_user_form})

我的模特是:

class ProfileUser(models.Model):
    user = models.OneToOneField(settings.AUTH_USER_MODEL)

    field1 = models.CharField(max_length=155, blank=True)
    field2 = models.CharField(max_length=155, blank=True)
    field3 = models.DateField(blank=True)
    field4 = models.CharField(max_length=255, blank=True)

    chosencategories=models.ForeignKey(Category, blank=True, null=True, related_name='categorieschosen')

    def __str__(self):
        return self.user.username

class Category(models.Model):
    name=models.CharField(max_length=100, choices=CATEGORIES)

    class Meta:
        verbose_name_plural = "categories"

    def __str__(self):
      return self.name

我希望允许用户选择 Category 对象的多个实例,并将这些实例保存到他们的个人资料中的 selectedcategories 属性中。我已经为此设置了模型和表单字段。

我查看了以下问题:

Django form not saving with ModelChoiceField - ForeignKey

Django: ValueError when saving an instance to a ForeignKey Field

How to solve ValueError When save ModelMultipleChoiceField in ModelForm?

所有这些都涉及该主题,但没有提供明确的解决方案。从我读过的内容来看,在我的视图调用“if profile_user_form.is_valid():”之前,我似乎需要提供对 Category 对象的某种引用 - 我被困在我需要包含的内容和原因上。

感谢所有帮助。谢谢。

【问题讨论】:

  • 根据您的型号ProfileUser 只能有一个类别chosencategories。所以这里不可能使用MultipleChoiceField
  • 谢谢。这就是问题所在。

标签: python django django-forms


【解决方案1】:

如果您想将多个类别分配给ProfileUserchosencategories 应该是ManyToManyField 而不是ForeignKey

【讨论】:

  • 谢谢。这很有帮助。我将 ForeignKey 更改为 ManyToManyField,然后将:user_profile_form.save_m2m() 添加到我的视图中。
  • 另外,如果有人遇到类似问题,我发现这篇博文很有帮助:joshuakehn.com/2013/6/23/django-m2m-modelform.html
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-31
  • 1970-01-01
  • 1970-01-01
  • 2015-04-30
  • 2021-10-18
  • 1970-01-01
  • 2021-11-05
相关资源
最近更新 更多