【问题标题】:Cannot assign [...] must be a "CustomUser" instance无法分配 [...] 必须是“CustomUser”实例
【发布时间】:2019-08-03 20:26:04
【问题描述】:

我正在构建一个带有表单的 Django 应用程序,其中登录用户(作曲家)能够提交他们编写的作品。出于这个原因,我希望这个作品的“作曲家”字段已经填充了他们的名字,只读。

我创建了一个自定义用户模型并通过设置中的 AUTH_USER_MODEL 链接它。

当我通过管理界面创建新作品时,我有一个作曲家的下拉列表(显示可用用户),我可以成功创建新作品。但是,在通过前端做同样的事情时,我得到一个“无法分配“'1'”:“Composition.composer”必须是“CustomUser”实例。错误。

我也尝试过在合成模型中使用 get_user_model() 而不是 'settings.AUTH_USER_MODEL',尝试了收集活动用户的所有不同方式,例如将 request.user 放入变量 'activeuser'上下文并使用 value="{{ activeuser }}" 手动设置表单,都无济于事。

如果我在views.py (def composition_create_view(request)) 中输入active_user = request.user.somethingwrong,我会在提交表单时收到'CustomUser' object has no attribute 'something' 错误,这表明我实际上正在获取CustomUser 对象。我错了吗?

myapp/models.py:

    title       = models.CharField(max_length=120) # max_length = required
    description = models.TextField(blank=True, null=True)
    composer = models.ForeignKey(
      settings.AUTH_USER_MODEL,
      on_delete=models.CASCADE
    )

用户/模型.py:

from django.contrib.auth.models import AbstractUser, UserManager


class CustomUserManager(UserManager):
    pass


class CustomUser(AbstractUser):
    pass

settings.py:

AUTH_USER_MODEL = 'users.CustomUser'

myapp/views.py:

    active_user = request.user
    form = CompositionForm(request.POST or None, initial={'composer' : active_user})
    if form.is_valid():
        form.save()
        form = CompositionForm()
    context = {
        'form': form
    }
    return render(request, "compositions/composition_create.html", context)

myapp/form.py:

#from django.contrib.auth import get_user_model

class CompositionForm(forms.ModelForm):
    title       = forms.CharField(label='Title',
                    widget=forms.TextInput(attrs={"placeholder": "Your title"}))
    description = forms.CharField(
                        required=False,
                        widget=forms.Textarea(
                                attrs={
                                    "placeholder": "Your description",
                                }
                            )
                        )
    composer = forms.CharField(label='Composer', widget=forms.TextInput(attrs={
                                    "readonly": "readonly",
                                }
                            )
                        )



    class Meta:
        model = Composition
        fields = [
            'title',
            'description',
            'composer',
        ]

我希望在点击保存后保存作文;相反,我得到“无法分配“[我登录的任何用户]”:“Composition.composer”必须是“CustomUser”实例。错误

【问题讨论】:

  • 作曲家字段应该是 ModelChoiceField 传递了您的 CustomUser 模型的查询集
  • 或者更好的是,不要定义自定义“composer”字段,只需在模型表单docs.djangoproject.com/en/2.2/topics/forms/modelforms/…的 Meta 中设置只读小部件@
  • @IainShelvington 谢谢!!!我整天都在与这个作斗争,只是通过评论 forms.py 中的“作曲家”字段并将'widgets={'composer': forms.TextInput(attrs={"readonly": "readonly"})}' 添加到forms.py 中的class Meta: 中,问题就消失了。我无法将您的答案设置为正确答案,可能是因为我的帐户不够“专业”。再次感谢。

标签: django python-3.x django-forms


【解决方案1】:

感谢@IainShelvington 的帮助,我解决了在forms.py 中评论composer 字段并添加

widgets={'composer': forms.TextInput(attrs={"readonly": "readonly"})}

致我的class Meta:

【讨论】:

    猜你喜欢
    • 2021-09-05
    • 2011-02-22
    • 2018-06-03
    • 1970-01-01
    • 1970-01-01
    • 2018-07-28
    • 1970-01-01
    • 2020-12-05
    相关资源
    最近更新 更多