django - 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
模型中。每次编辑帖子时,它都会执行相同的操作。但是代码将编辑后的帖子保存到模型Post
和PostEditHistory
模型中,原始帖子丢失了。帮我解决问题。
提前致谢。
解决方案
在使用 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)
推荐阅读
- three.js - 我可以在整个合并的缓冲几何体上应用法线贴图吗?
- r - 根据我的代码,有没有人认为他们可以告诉我是什么导致了这个错误“参数意味着不同的行数:1、0”在 R 中?
- java - 如何创建一个点击更新的 JLabel?
- python - 添加新的子目录而不删除现有的子目录
- ios - 如何根据内容调整文本标签高度
- wordpress - 我需要帮助在我网站上的封面图片上添加 svg 文本徽标
- sql - 如何以正确的格式将日期时间变量传递给 SQL 字符串?
- ms-access-2016 - MS Access 2016 查询
- python - 确定值的分配 - Python
- uml - Plantuml:如何在同一级别上绘制 2 个序列消息?