【问题标题】:Django - user profile :UNIQUE constraint failed: main_userprofile.user_idDjango - 用户配置文件:UNIQUE 约束失败:main_userprofile.user_id
【发布时间】: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


【解决方案1】:

在视图中尝试这样,您需要将实例传递给表单以便更新相同,

def profile_form_update(request):
    instance = get_object_or_404(UserProfile, user=request.user)
    if request.method == 'POST':
        form = UserProfileForm(request.POST, request.FILES, instance=instance)
        if form.is_valid():
            instance = form.save(commit=False)
            instance.user = request.user
            instance.save()
    else:
        form = UserProfileForm(instance=instance)
    context = {
       "form":form,
       "instance": instance,}
    return render(request, "profile_form.html", context)

【讨论】:

  • 我这样做了,但它带来了这个错误:在赋值之前引用了局部变量“表单”。当我评论第二行中的 requesr.post 错误是:用户没有“配置文件”对象
  • tnx 问题已解决。我在此之前尝试过,但在实例中我没有输入 user = request.user
猜你喜欢
  • 2017-08-05
  • 2017-03-04
  • 2020-04-24
  • 1970-01-01
  • 1970-01-01
  • 2020-04-23
  • 1970-01-01
  • 2018-11-17
  • 1970-01-01
相关资源
最近更新 更多