Django - Ограничить пользователей, которые просматривают предметы - PullRequest
2 голосов
/ 04 августа 2010

Мои модели:

class PromoNotification(models.Model):
    title = models.CharField(_('Title'), max_length=200)
    content = models.TextField(_('Content'))
    users = models.ManyToManyField(User, blank=True, null=True)
    groups = models.ManyToManyField(Group, blank=True, null=True)

Я хочу публиковать там элементы в шаблонах с некоторыми разрешениями. Шаблон показывает только уведомления для пользователей, которые есть в списке (пользователи или / и группы). Что я должен делать? Спасибо за любую помощь. Пожалуйста, покажи мне несколько кодов, если сможешь.

1 Ответ

4 голосов
/ 04 августа 2010

Вы можете использовать собственный менеджер, который упрощает фильтрацию пользователей в нескольких представлениях.

class PromoNotificationManager(models.Manager):
    def get_for_user(self, user)
        """Retrieve the notifications that are visible to the specified user"""
        # untested, but should be close to what you need
        notifications = super(PromoNotificationManager, self).get_query_set()
        user_filter = Q(groups__in=user.groups.all())
        group_filter = Q(users__in=user.groups.all())
        return notifications.filter(user_filter | group_filter)

Подключите менеджер к вашей модели PromoNotification:

class PromoNotification(models.Model):
    ...
    objects = PromoNotificationManager()

Тогда, на ваш взгляд:

def some_view(self):
    user_notifications = PromoNotification.objects.get_for_user(request.user)

Подробнее о пользовательских менеджерах вы можете прочитать в документации: http://www.djangoproject.com/documentation/models/custom_managers/

...