无法分配[...]必须是“ CustomUser”实例

时间:2019-08-03 20:26:04

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

我正在使用表单构建Django应用程序,登录用户(作曲家)可以提交他们编写的作品。因此,我希望此作品的“ composer”字段已经填充了其名称(只读)。

我已经创建了一个自定义用户模型,并通过AUTH_USER_MODEL在设置中将其链接。

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

我还尝试过使用Composition_model中的get_user_model()而不是'settings.AUTH_USER_MODEL',并尝试了各种收集活动用户的方式,例如将request.user放入变量'activeuser'中。上下文,并使用value =“ {{activeuser}}”手动设置表单,但无济于事。

如果我将active_user = request.user.somethingwrong放入views.py(def composition_create_view(request))中,则在提交表单时收到'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
    )

users / models.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”实例。错误

1 个答案:

答案 0 :(得分:0)

由于@IainShelvington的帮助,我解决了注释composer中的forms.py字段并添加

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

到我的class Meta: