Django: использование именованных URL-адресов в декораторе @login_required

Большинство views в моем приложении django используют декоратор @login_required. Кроме того, у меня есть три разных URL-адреса для входа. Представления имеют соответствующие URL-адреса для входа в систему, жестко закодированные в их декораторах @login_required.

@login_required('myapp/logintype1'):
def usertype1_home(request):
    # Further dode
    # ...


@login_required('myapp/logintype2'):
def usertype2_home(request):
    # Further code
    # ...

Поскольку количество таких просмотров довольно велико, всякий раз, когда я меняю URL-адрес входа в urls.py, мне приходится менять login-url во всех декораторах. Я хочу использовать что-то вроде {% urls 'urlpatter1' %} и {% urls 'urlpatter2' %}. Могу ли я использовать reverse?

Как я могу использовать именованные шаблоны URL-адресов вместо жестко заданных шаблонов URL-адресов в декораторе @login_required?


person narendra-choudhary    schedule 17.07.2015    source источник
comment
Если вы разделили группу пользователей на несколько типов, я бы также рекомендовал вам использовать декоратор user_passes_test. Например, @user_passes_test(lambda u: u.is_type1)   -  person Chemical Programmer    schedule 17.07.2015


Ответы (1)


Где-то в начале views.py после import ... операторов добавьте что-то вроде этого

login_type1 = reverse_lazy('urlpatter1') # or LOGIN_TYPE1
login_type2 = reverse_lazy('urlpatter2') # or LOGIN_TYPE2

И использовать эти переменные позже

@login_required(login_url=login_type1)
...

ОБНОВЛЕНИЕ: reverse был заменен на reverse_lazy, как предложил @Alasdair. См. документы (2-й пункт).

person f43d65    schedule 17.07.2015
comment
Это должно работать, если вы используете reverse_lazy вместо reverse. - person Alasdair; 17.07.2015
comment
@Alasdair, ты был прав. lazy_reverse работал. reverse показывает ошибку. - person narendra-choudhary; 18.07.2015