Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django模型:意外行为_Django_Django Models - Fatal编程技术网

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.

是的,我理解这一点,但如果我需要这样做,我的代码中会有什么错误?