使用Django模型权限时引发DoesNotExist错误

3
我有一些关于Django Guardian的问题。我定义了一个新闻模型。
class News(models.Model):
    title = models.CharField(_('Title'), max_length=255)
    slug = models.SlugField(_('Slug'), unique_for_date='pub_date',)

    objects = models.Manager()
    featured = FeaturedNewsManager()

    link = models.URLField(_('Link'), blank=True, null=True,)

    class Meta:
        permissions = (('view_news', _('view news')))

接着我尝试将view_news权限分配给我的某个用户时,出现以下错误:

>>> from guardian.shortcuts import assign_perm
>>> g = Group.objects.latest('pk')
>>> n = News.objects.get(pk=4)
>>> assign_perm( 'news.view_news', g, n)
Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "/home/roberto/.virtualenvs/ve_news/local/lib/python2.7/site-packages/guardian/shortcuts.py", line 93, in assign_perm
    return model.objects.assign_perm(perm, group, obj)
  File "/home/roberto/.virtualenvs/ve_news/local/lib/python2.7/site-packages/guardian/managers.py", line 90, in assign_perm
    permission = Permission.objects.get(content_type=ctype, codename=perm)
  File "/home/roberto/.virtualenvs/ve_news/local/lib/python2.7/site-packages/django/db/models/manager.py", line 143, in get
    return self.get_query_set().get(*args, **kwargs)
  File "/home/roberto/.virtualenvs/ve_news/local/lib/python2.7/site-packages/django/db/models/query.py", line 404, in get
    self.model._meta.object_name)
DoesNotExist: Permission matching query does not exist.

我已经尝试迁移我的应用程序,但似乎这并没有解决我的问题。请帮忙吗?

谢谢!

2个回答

5

尝试执行:

python manage.py syncdb --all 

或者您可以自己创建迁移以处理新权限(south 存在一个 bug,会阻止 guardian 权限的自动创建迁移)


1

我认为syncdb在这里没起到作用。我猜想当你将更多的权限加入列表时,你的代码开始起作用。

这行代码有错误:

permissions = (('view_news', _('view news')))

它应该是:

它应该是:

permissions = (('view_news', _('view news')),)

请注意逗号的缺失。Permissions是一个元组嵌套元组,其中每个元组对应着一种权限(权限代码权限描述)。 编辑: 我曾经也掉入了同样的陷阱。避免这种情况发生的最好方法是即使只有一个权限也按照以下方式组织代码:
permissions = (
    ('view_news', _('view news')),
)

接下来请按照 @Foo Party 和 @sogeking 提到的做一个 syncdb

$ python manage.py syncdb

是的,抱歉,我已经在我的代码中添加了那个逗号,但忘记在这里编辑帖子 :-) - sogeking
1
如果我没记错的话,我需要重新运行syncdb,就像@foo-party建议的那样。谢谢! :-) - sogeking
是的,这将在数据库中创建额外的权限信息。 - Medeiros
@sogeking 帖子仍未编辑,请尽快完成。 - lajarre

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接