Ограничьте доступ к части шаблона пользователями, которые являются частью группы, используя представления на основе классов. Джанго 2.0

Я хочу запретить пользователям в определенных группах доступ к частям шаблона HTML. У меня есть представление на основе классов, которое выглядит так:

Views.py

class PostListView(ListView):
    model = BlogPost
    paginate_by = 10
    template_name = 'main/mysite.html'

С представлениями на основе функций я могу ограничить доступ к шаблону на основе чьей-то группы, используя request.user.groups.filter(name='GROUP_NAME').exists() из Как в Django проверить, входит ли пользователь в определенную группу?

Я попытался изменить свой шаблон view.py и HTML следующим образом:

views.py

class PostListView(ListView):
    model = BlogPost
    paginate_by = 10
    template_name = 'main/mysite.html'

    def dispatch(self, request):
        in_group =  request.user.groups.filter(name='GROUP_NAME').exists()
        return in_group

ШАБЛОН HTML

....
{% if in_group %}
some code here shows up if user belong to group
{% endif %}
....

Это даст мне правильное отображение, когда пользователь не является членом группы, но когда он является членом правильной группы, я получаю ошибку атрибуции:

Exception Type: AttributeError at /mysite
Exception Value: 'bool' object has no attribute 'get'

person ccsv    schedule 30.05.2018    source источник


Ответы (1)


Чтобы получить контекстную переменную в шаблоне при использовании представления на основе классов, нужно переопределить метод get_context_data():

class PostListView(ListView):
    model = BlogPost
    paginate_by = 10
    template_name = 'main/mysite.html'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['in_group'] =  self.request.user.groups.filter(name='GROUP_NAME').exists()
        return context

См. Django docs для получения дополнительной информации о get_context_data().

person Franey    schedule 30.05.2018