Ограничение доступа для аутентифицированного пользователя

Я пытаюсь ограничить доступ авторизованного пользователя на сайте фотогалереи. Я хочу, чтобы аутентифицированный пользователь видел все фотографии, а неаутентифицированный - только три.

Я использую стороннюю библиотеку под названием Photologue, которая имеет класс GalleryDetailView(), который наследуется от DetailView(). Я хочу переопределить метод get_context_data() в подробном представлении галереи и добавить туда код, который подготавливает список фотографий для отображения и добавляет этот список в контекст шаблона. Пока что у меня есть:

class CustomGalleryDetailView(GalleryDetailView):

    def get_context_data(self, **kwargs):
        context = super(CustomGalleryDetailView, self).get_context_data(**kwargs)
        if not self.request.user.is_authenticated():
            items = OrderedDict(itertools.islice(context.iteritems(), 4))
            return items

        else:
            return context

РЕДАКТИРОВАТЬ: На основе некоторых ответов у меня теперь есть:

class CustomGalleryDetailView(GalleryDetailView):

    def get_context_data(self, **kwargs):
        context = super(CustomGalleryDetailView, self).get_context_data(**kwargs)
        if not self.request.user.is_authenticated():
            context['object'] = Gallery.objects.filter()[:3]
            return context

        else:
            return context

Но по какой-то причине пользователи, прошедшие проверку подлинности и не прошедшие проверку, все еще видят все фотографии Я знаю, что аутентификация работает, потому что я баловался с этим часами и видел разные результаты (только не те, которые мне нужны).

2 ответа

Хотя я не понял проблему с подходом mixin/view, я решил проблему с помощью простого if/else внутри шаблона:

{% if user.is_authenticated%} {% для фотографии в галерее%}... {% endfor%} {% else%} {% для фотографии в галерее |slice:":3" %} ... {% endfor %} {% endif %}

Казалось, что-то более "правильно" ограничивать результаты в представлении, а не обрабатывать логику внутри шаблона, но это простое решение, и оно работает.

Прежде всего, выйти context = ... из если Во-вторых, добавьте отпечатки или контрольные точки, чтобы убедиться, что вы находитесь в первой части второй части if.

Другие вопросы по тегам