【发布时间】:2018-01-09 17:27:28
【问题描述】:
我正在尝试为我现有的用户模型构建配置文件模型。
models.py
class UserProfile(models.Model):
first_name = models.CharField(max_length=12,null=True)
last_name = models.CharField(max_length=12,null=True)
avatar = models.ImageField(null=True,upload_to='media_file/avatar/')
user = models.OneToOneField(User,on_delete=models.CASCADE,
related_name='profile',unique=True)
bio = models.TextField(max_length=500)
birthday = models.DateTimeField(
blank=True, null=True)
def create_profile(sender, **kwargs):
user = kwargs["instance"]
if kwargs["created"]:
user_profile = UserProfile(user=user)
user_profile.save()
post_save.connect(create_profile, sender=User)
def __str__(self):
return self.user.username
所以我将 forms.py 构建为:
class UserProfileForm(forms.ModelForm):
birthday = forms.DateField(widget=forms.SelectDateWidget)
class Meta:
model = UserProfile
fields = "__all__"
exclude =["user"]
我这样写了我的views.py:
def profile_form_update(request):
if request.method =="GET":
form = UserProfileForm()
return render(request,"profile_form.html",{"form":form})
if request.method == 'POST':
instance = get_object_or_404(UserProfile, user=request.user)
form =UserProfileForm (request.POST or None, request.FILES or None,)
if form.is_valid():
instance = form.save(commit=False)
instance.user = request.user
instance.save()
context = {
"form":form,
"instance": instance,}
return render(request, "profile_form.html", context)
首先这是有效的,当我在 django 管理面板中创建配置文件时。当我尝试加载现有表单时,表单会使用存储在数据库中的内容呈现。当对表单进行任何更改时出现错误:
IntegrityError at /profile/update/
UNIQUE constraint failed: main_userprofile.user_id
我知道我的问题是存储在用户模型中的现有数据。我做了一些谷歌,有人说:
您告诉 UserProfiles UserProfiles.u_id 是唯一的,它不是(空白/空)。所以你得到了错误。您可能需要考虑将 u_id 更改为 AutoField 主键。然后使用 models.ForeignKey('UserBase') 连接它们
【问题讨论】:
-
只需删除
unique参数。一对一的字段就是这样,所以你不需要它。 -
我这样做了。当我渲染表单时:页面_404:未找到
-
更改后不要忘记迁移。你什么时候得到错误?是在您创建新的用户配置文件时,还是在编辑已创建的用户配置文件时?
-
如果用户未登录,或者该用户的配置文件不存在,您将收到 404。您应该为您的视图使用
login_required装饰器。 -
如果应该只是通过表单,请将
unique更改为blank。如果您不希望它是强制性的,请添加null。
标签: django django-views