代码之家  ›  专栏  ›  技术社区  ›  gabbar0x

无法更新一对一Django模型

  •  1
  • gabbar0x  · 技术社区  · 7 年前

    我正在使用默认的django“用户”模型创建用户。成功创建后,此用户将被定向到一个配置文件页面,在该页面上要求用户填写其配置文件。配置文件,或 Profile 模型有一个 OneToOneField 具有 User .第一次保存时,配置文件成功,因为第一次插入时 request.user 而且这个配置文件对象还没有被创建。

    在以后尝试编辑此表单时,我得到一个错误

    返回database.cursor.execute(self、query、params) sqlite3.integrityerror:非空约束失败: app_profile.user_id上述异常是 以下异常:。.返回database.cursor.execute(self,query, params)django.db.utils.integrityerror:非空约束失败: app_profile.user_id[2018年6月26日06:32:51]“发布/配置文件/http/1.1” 500 162255

    这是我的 简况 模型

    class Profile(models.Model):
        user = models.OneToOneField(User, on_delete=models.CASCADE)
        type = models.CharField(choices=(
            ('content-creator', 'Content Creator'),
            ('artist', 'Artist'),
        ), max_length=20)
        about = models.CharField(max_length=100, blank=True)
        birth_date = models.DateField(null=True, blank=True)
        location = models.CharField(max_length=30, blank=True)
    
        youtube = models.URLField(null=True, blank=True)
        instagram = models.URLField(null=True, blank=True)
        facebook = models.URLField(null=True, blank=True)
        twitter = models.URLField(null=True, blank=True)
        website = models.URLField(null=True, blank=True)
        other = models.TextField(null=True, max_length=100, blank=True)
    

    这里是 简况 看法

    class ProfileView(LoginRequiredMixin, View):
        login_url = '/login/'
        redirect_field_name = 'redirect_to'
    
        form_class = ProfileForm
        template_name = 'app/profile.html'
        initial = {}
    
        def get(self, request, *args, **kwargs):
            profile = Profile.objects.get(user=request.user)
            if profile:
                form = ProfileForm(instance=profile)
            else:
                form = self.form_class(initial=self.initial)
            return render(request, self.template_name, {'form': form})
    
        def post(self, request, *args, **kwargs):
            form = ProfileForm(request.POST)
            if form.is_valid():
                profile_obj = form.save(commit=False)
                profile_obj.user = request.user
                profile_obj.save()
            return render(request, self.template_name, {'form': form})
    

    我的逻辑出了什么问题?我认为这应该是非常直接的处理,但我不能让我的头脑。

    1 回复  |  直到 7 年前
        1
  •  1
  •   neverwalkaloner    7 年前

    你不能通过 instance post() POST

    def post(self, request, *args, **kwargs):
        profile = Profile.objects.filter(user=request.user).first()
        if profile: 
            form = ProfileForm(request.POST, instance=profile)
        else:
            form = ProfileForm(request.POST)
        if form.is_valid():
            profile_obj = form.save(commit=False)
            profile_obj.user = request.user
            profile_obj.save()
        return render(request, self.template_name, {'form': form})