【问题标题】:Django: Can't update database properlyDjango:无法正确更新数据库
【发布时间】:2018-12-15 04:56:40
【问题描述】:

models.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()

views.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 模型中,原始帖子丢失了。帮我解决问题。

提前致谢。

【问题讨论】:

  • 添加了一些建议@Shakir 也许它可以帮助你改进你的代码
  • 您在这里没有“以前的”或“已编辑”的帖子,这是两个名字下的同一个帖子。而且您在历史记录中存储的只是一个外键,而不是帖子更新前的状态。

标签: django python-3.x django-orm


【解决方案1】:

在使用 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)

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

Obs.:不要直接使用 .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)

【讨论】:

  • 我已经用你的逻辑替换了我的逻辑,但它和我的一样。我发现没有区别。
  • 我的建议不会给你任何不同...但会遵循一些使用 MVC 的基本规则
  • 首先你的问题你应该按照我在开始在保存表单后更改退货时所说的步骤
猜你喜欢
  • 1970-01-01
  • 2014-10-14
  • 1970-01-01
  • 1970-01-01
  • 2021-07-18
  • 2015-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多