Search code examples
djangodecoratorurl-pattern

Django: Using named urls in @login_required decorator


Most of views in my django app use @login_required decorator. Also, I have three different login urls. Views have corresponding login urls hardcoded into their @login_required decorators.

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


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

Since the number of such views is quite large, whenever I change login url in urls.py I have to change login-url in all the decorators. I want to use something like {% urls 'urlpatter1' %} and {% urls 'urlpatter2' %}. Can I use reverse?

How I can use named url patterns instead of hard coding url patterns in @login_required decorator?


Solution

  • Somewhere in the top of views.py after import ... statements add something like this

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

    And use these variables later

    @login_required(login_url=login_type1)
    ...
    

    UPDATE: reverse was replaced with reverse_lazy as @Alasdair suggested. See docs (2nd point).