Django模型:意外行为
我有这样的看法:Django模型:意外行为,django,django-models,Django,Django Models,我有这样的看法: def finish_creation(request, pre_id): pre_post = PrePost.objects.get(pk = pre_id) if pre_id == pre_post.id: this = Post.objects.create( author = pre_post.author, title = pre_post.title, tex
def finish_creation(request, pre_id):
pre_post = PrePost.objects.get(pk = pre_id)
if pre_id == pre_post.id:
this = Post.objects.create(
author = pre_post.author,
title = pre_post.title,
text = pre_post.text
)
this.pswd = some_password
this.save()
pre_post.delete()
return HttpResponseRedirect(this.get_absolute_url())
说明:未经授权的用户(作者)可以在站点上写文章,但首先在数据库中创建一些临时的帖子,并向作者发送电子邮件,其中包含激活的链接(将临时帖子转换为永久帖子)。在follow链接从PrePost元素创建Post之后,PrePost从数据库中删除,用户自动重定向到其发布的Post
但是有错误:前后匹配查询不存在。
但其他一切都没问题:
1) 波斯特创造完美
2) Pre_post删除完美
只有返回HttpResponseRedirect(this.get\u absolute\u url())
不起作用
但是,错误页面在视图pre\u post=PrePost.objects.get(pk=pre\u id)
怎么可能呢
谢谢
编辑:
但是,当我没有删除
pre_post
时,一切都像预期的那样正常(除了删除pre_post)。delete()有什么问题吗?这是一个非常糟糕的设计。您不应该为了发布数据而将数据从一个表移动到另一个表。只需在一个模型中添加一个字段。例如:
class Post(models.Model):
...
approved = models.BooleanField(default=False)
然后,您可以编写一个自定义管理器,以仅获取已批准的帖子:
class PostManager(models.Manager):
def approved(self):
return self.filter(approved=True)
class Post(models.Model):
...
objects = PostManager()
最后,在视图和模板中,只需使用Post.objects.approved()
,而不是Post.objects.all()
。所以只有经过批准的帖子才会出现在网站上
然后,当用户是超级用户或您想要的任何其他名称时,您只能在表单中显示approved
字段,并且只有他们才能将其标记为approved
您还可以通过许多其他方式实现这一点,例如只有超级用户才能设置的“已发布”状态,等等,但这是一般的想法
编辑当前代码的问题是,始终存在对象不存在的可能性。您必须考虑到这种可能性,始终将对get
的调用包装在try…中,除了
块:
try:
pre_post = PrePost.objects.get(pk = pre_id)
except PrePost.DoesNotExist:
# Do something or...
pass
else:
# object exists; you can do stuff with it here.
是的,我理解这一点,但如果我需要这样做,我的代码中会有什么错误?