Ограничение доступа для аутентифицированного пользователя
Я пытаюсь ограничить доступ авторизованного пользователя на сайте фотогалереи. Я хочу, чтобы аутентифицированный пользователь видел все фотографии, а неаутентифицированный - только три.
Я использую стороннюю библиотеку под названием 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.