1

django-guardian 関数 get_objects_for_user の動作を理解できません。グループ オブジェクトの権限を割り当てていますが、get_objects_for_user にはそれらの権限がないようです。

>>> u = User.objects.get(username='angus')
>>> u.has_perm('news.change_news', n)
True
>>> from guardian.shortcuts import get_objects_for_user
>>> get_objects_for_user(u, (u'news.change_news', ))
[]
>>> get_objects_for_user(u, ('change_news'), klass=News)
[]

ただし、ドキュメントは非常に明確に見えます。

get_objects_for_user: (user, perms, klass=None, use_groups=True, any_perm=False)
Returns queryset of objects for which a given ``user`` has *all*
permissions present at ``perms``.

どこからデバッグを開始すればよいかさえわかりません。助言がありますか?

アップデート:

私のモデルは次のように定義されています。

class News(models.Model):
    departments = models.ManyToManyField(Department, blank=True, related_name='news', through='NewsDepartmentMembership')
    research_groups = models.ManyToManyField(Group, blank=True, related_name='news', through='NewsGroupMembership')
    people_involved = models.ManyToManyField(Person, blank=True, related_name='news')
    related_news = models.ManyToManyField('News', blank=True)

    title = models.CharField(_('Title'), max_length=255)
    slug = models.SlugField(_('Slug'), unique_for_date='pub_date',)
    excerpt = models.TextField(_('Excerpt'), blank=True)
    content = models.TextField(_('Content'), blank=True)

    is_published = models.BooleanField(_('Published'), default=False)
    pub_date = models.DateTimeField(_('Publication date'), default=datetime.datetime.now)
    is_feat = models.BooleanField(_('Featured'), default=False)

    published = PublishedNewsManager()
    objects = models.Manager()
    featured = FeaturedNewsManager()
4

1 に答える 1

1

次のように使用します: news = get_objects_for_user(u, ('change_news'), klass=News)

編集:まあ、問題がどこにあるかを把握するのは簡単です。ユーザーとオブジェクトの間に実際に存在します。少し前に同様の問題に遭遇しましたが、正しく覚えていれば、ユーザーがスーパーユーザーであることに関係していました。ユーザーに対して is_superuser false を設定してみて、has_perm が true を返すかどうかを確認してください。

また、可能であれば、プロジェクトが大きくなったときに get_objects_for_user ショートカットを使用しないことをお勧めします。データベースでより多くのオブジェクト/権限を取得すると、クエリが非常に遅くなります。

アラン

于 2013-10-18T07:36:44.797 に答える