Django перенаправляет на другой вид/страницу при отказе в разрешении
Hej!
У меня есть представление, в котором отображаются контактные данные. Цель состоит в том, чтобы некоторые пользователи могли видеть все детали ('A'), а некоторые - только имя ('B'). Поэтому у меня есть два сериализатора в моей модели и два представления (по одному для каждого сериализатора). Пользователи разделены на две группы
@user_passes_test
действительно работает, поэтому только те, кто входит в группу 'A', могут попасть в представление с деталями.
Я хочу, чтобы те, которые находятся в группе 'B', автоматически перенаправлялись на вид/страницу, где детали свернуты.
Есть идеи, как этого добиться?
У меня есть:
# views.py
def contacts_check(user):
return user.groups.filter(name="Contacts = True").exists()
@login_required
@user_passes_test(contacts_check)
def contacts(request):
.
.
.
@login_required
def contacts_small(request):
.
.
.
# urls.py
app_name = "app"
urlpatterns = [
path("contacts", contacts, name="contacts"),
path("contacts2", contacts_small, name='contacts2')
]
Я пытался:
@user_passes_test(contacts_check, login_url='contacts')
но обе группы пользователей направляются на url 'contacts' с полным просмотром. ('B' получает ошибку, что у пользователя нет доступа). То же самое, когда login_url='contacts2'.
Я также пробовал:
def sees_contacts(self):
if str(self.user.groups.filter) == 'Contacts = True':
return True
else:
return False
con_login_required = user_passes_test(lambda u: True if u.sees_individuals else False, login_url='individuals2')
def contacts_login_required(view_func):
decorated_view_func = login_required(con_login_required(view_func), login_url='contacts2')
return decorated_view_func
У кого-нибудь есть идеи, что я делаю неправильно?
В urls.py просто используйте один путь
path("contacts/", contacts_view, name="contacts-view"),
then in the method
def contacts_view(request):
if sees_contacts():
return contacts(request)
return contacts_small(request)
Это поможет сохранить шаблоны url менее запутанными для вас и пользователей и позволит вам легко разделять представления.