【问题标题】:Unable to Update One to One Django Models无法更新一对一的 Django 模型
【发布时间】:2018-12-04 18:40:49
【问题描述】:

我正在使用默认的 Django 'User' 模型来创建用户。成功创建后,此用户将被定向到个人资料页面,要求他们填写个人资料。配置文件或Profile 模型具有OneToOneFieldUser。在第一次保存时,配置文件成功,因为第一次插入是使用 request.user 并且尚未创建配置文件对象。

在以后尝试编辑此表单时,我收到一条错误消息,提示

return Database.Cursor.execute(self, query, params) sqlite3.IntegrityError:NOT NULL 约束失败: app_profile.user_id 上述异常是导致 以下异常:. .返回 Database.Cursor.execute(self, query, 参数)django.db.utils.IntegrityError:NOT NULL 约束失败: app_profile.user_id [26/Jun/2018 06:32:51] “POST /profile/ HTTP/1.1” 500 162255

这是我的Profile 模型

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)

这是Profile 视图

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})

我的逻辑有什么问题?我认为这应该很容易处理,但我无法理解它。

【问题讨论】:

    标签: django django-models django-forms django-views


    【解决方案1】:

    您没有将instance 参数传递给post() 方法中的表单。如果没有它,Django 会尝试在每个 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})
    

    【讨论】:

    • 啊完美。我在 get 方法中这样做,但在这里错过了。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2021-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多