我正在使用表单构建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”实例。错误
答案 0 :(得分:0)
由于@IainShelvington的帮助,我解决了注释composer
中的forms.py
字段并添加
widgets={'composer': forms.TextInput(attrs={"readonly": "readonly"})}
到我的class Meta:
。