【发布时间】: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