Страница перенаправления с помощью представления на основе классов (CBV) Django 2.1 Python

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

def home_redirect(request):
    user_role = Profile.objects.get(user = request.user).role
    if user_role in internal_users:
        return redirect(reverse_lazy('home'))
    else:
        return redirect(reverse_lazy('event_list'))

Я в курсе RedirectView. Но как я могу получить запрос в CBV, чтобы получить user.role, как в request.user.role? Я знаю, что могу получить user.role в определенных функциях в CBV следующим образом:

class HomeRedirectView(RedirectView):
    def get_context_data(self, **kwargs):
        context = super(HomeRedirectView, self).get_context_data(**kwargs)
        context['current_user'] = Profile.objects.get(user = self.request.user)
        user_role = context['current_user'].role
        return context

    #Can't access user_role but if I could I would do something like this
    if user_role in internal_users:
        url = reverse_lazy('home')
    else:
        url = reverse_lazy('event_list')

Как я могу получить доступ к user_role вне get_context_data() в CBV?

1 ответ

Решение

В RedirectView [Джанго-док], вам не нужно реализовывать get_context_data функция, URL определяется get_redirect_url метод [Django-doc], так что вы можете реализовать это как:

class HomeRedirectView(RedirectView):

    def get_redirect_url(self, *args, **kwargs):
        user_role = Profile.objects.get(user=self.request.user).role
        if user_role in internal_users:
            return reverse('home')
        else:
            return reverse('event_list')

url Атрибут [Django-doc] устанавливается только в том случае, если URL-адрес является статическим, но вы, таким образом, можете реализовать get_redirect_url в случае, если контент не является статичным.

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