Страница перенаправления с помощью представления на основе классов (CBV) Django 2.1 Python - PullRequest
0 голосов
/ 31 декабря 2018

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

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 Ответ

0 голосов
/ 31 декабря 2018

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

class HomeRedirectView(RedirectView):

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

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

...