Страница перенаправления с помощью представления на основе классов (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
в случае, если контент не является статичным.