2011-12-05 30 views
0

我有这样的观点:Django模型:意外的行为

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

说明:未经授权的用户(作者)可以写上网站的帖子,但首先在数据库中创建一些临时pre_post和发送电子邮件,在它的链接创作激活(将临时pre_post转移到永久职位)。在按照链接创建Post从PrePost元素后,PrePost从数据库中删除,用户自动重定向到他的已发布帖子。

但有错误Pre_Post matching query does not exist.

但一切是OK:

1)邮政创造完美,

2)Pre_post删除完美,

只有return HttpResponseRedirect(this.get_absolute_url())没有按不工作...

但是,错误页面在视图中的第一行指向pre_post = PrePost.objects.get(pk = pre_id)

它怎么可能?

谢谢。

编辑:

但是,当我没有删除预期(除了pre_post的缺失)pre_post一切正常。那个delete()有什么问题?

回答

2

这是非常糟糕的设计开始。您不应该将数据从一个表格移动到另一个表格进行发布。只需添加一个字段到一个模型。例如:

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字段,只有他们能够将其标记为已批准。

您也可以通过许多其他方式来完成此操作,例如只有超级用户可以设置的“已发布”状态等,但这是一般想法。

编辑您当前的代码存在的问题是总会存在一个对象不存在的可能性。您必须在try...except块考虑这种可能性由总是包装调用get

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. 
+0

是的,我明白,但如果我需要的话,什么都可以错在我的代码? –