首页 > 解决方案 > Django:无法正确更新数据库

问题描述

模型.py

class Post(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    title = models.CharField(max_length=500, verbose_name='Title')
    post = models.TextField(verbose_name='Post')
    post_time = models.DateTimeField()
    update_time = models.DateTimeField()
    exists = models.BooleanField(default=True)

    def __str__(self):
        return self.title

    def save(self, *args, **kwargs):
        if not self.id:
            self.post_time = timezone.now()
            # self.exists = True
        self.update_time = timezone.now()
        return super(Post, self).save(*args, **kwargs)


class PostEditHistory(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    post = models.ForeignKey(Post, on_delete=models.CASCADE)
    title = models.CharField(max_length=500)
    body = models.TextField()
    edit_time = models.DateTimeField()

视图.py

@login_required
def edit_post(request, username, post_id):
    other_user = User.objects.get(username=username)
    post = Post.objects.get(user=other_user.pk, pk=post_id)
    prev_post = post

    form = EditPostForm(data=request.POST or None, instance=post)
    if form.is_valid():
        PostEditHistory.objects.create(
            user=request.user,
            post=prev_post,
            title=prev_post.title,
            body=prev_post.post,
            edit_time=prev_post.update_time
        )
        return redirect('single_post', username=username, post_id=post_id)
        form.save()


    context = {
        'form': form
    }
    return render(request, 'blog_post/edit_post.html', context)

在保存编辑后的帖子之前,我正在尝试将原始帖子保存到PostEditHistory模型中。每次编辑帖子时,它都会执行相同的操作。但是代码将编辑后的帖子保存到模型PostPostEditHistory模型中,原始帖子丢失了。帮我解决问题。

提前致谢。

标签: djangopython-3.xdjango-orm

解决方案


在使用 form.save() 之前,您将离开您的功能

 return redirect('single_post', username=username, post_id=post_id)
 form.save()

改变位置

 form.save()
 return redirect('single_post', username=username, post_id=post_id)

建议:您应该从视图中删除逻辑并仅在您的模型中使用函数处理它......

观察:不要直接使用 .objects.get() 因为如果它不存在会破坏你的页面并抛出错误,使用过滤器获取值而不破坏并检查它

class PostHistory(models.Model):
    ...
    @staticmethod
    def add_history(user, prev_post):
        PostEditHistory.objects.create(
            user=user,
            post=prev_post,
            title=prev_post.title,
            body=prev_post.post,
            edit_time=prev_post.update_time
        )

@login_required
def edit_post(request, username, post_id):
    ...
    post = Post.objects.filter(user=other_user.pk, pk=post_id).first()
    prev_post = post if post else None
    if form.is_valid():
        PostEditHistory.add_history(request.user, prev_post)
        form.save()

        return redirect('single_post', username=username, post_id=post_id)

推荐阅读