2009-10-05 6 views
35

Certaines des options du fichier de paramètres django sont des URL, par exemple LOGIN_URL et LOGIN_REDIRECT_URL. Est-il possible d'éviter le codage en dur de ces URL, et d'utiliser à la place la cartographie d'url inverse? Pour le moment, c'est vraiment le seul endroit où je me retrouve à écrire les mêmes URL à plusieurs endroits.Django - utiliser le mappage d'url inverse dans les paramètres

+2

Je doute, puisque 'settings.py' est chargé avant que le module URL. Intéressé de savoir si. Bonne question –

Répondre

48

Django 1.5 et plus tard

A partir de Django 1.5, LOGIN_URL et LOGIN_REDIRECT_URL accepter des modèles d'URL nommés. Cela signifie que vous n'avez pas besoin de coder en dur les URL dans vos paramètres.

LOGIN_URL = 'login' # name of url pattern 

Pour Django 01.05 à 01.09, vous pouvez également utiliser le nom de la fonction de vue, mais ce n'est pas recommandé car il est dépréciée dans Django 1.8 et ne fonctionne pas dans Django 1.10+.

LOGIN_URL = 'django.contrib.auth.views.login' # path to view function 

Django 1.4

Pour Django 1.4, vous pouvez pouvez utiliser reverse_lazy

LOGIN_URL = reverse_lazy('login') 

Django 1.3 et versions antérieures

Ceci est la réponse originale, qui a travaillé avant reverse_lazy a été ajouté à Django

Dans l'url s.py, les paramètres d'importation:

from django.conf import settings 

ajouter ensuite le modèle url

urlpatterns=('', 
    ... 
    url('^%s$' %settings.LOGIN_URL[1:], 'django.contrib.auth.views.login', 
     name="login") 
    ... 
) 

Notez que vous devez couper LOGIN_URL pour enlever la barre oblique.

Dans la coquille:

>>>from django.core.urlresolvers import reverse 
>>>reverse('login') 
'/accounts/login/' 
+1

Ah, bonne solution, je ne pensais pas aller de paramètres -> urls, seulement l'inverse. +1 –

+0

Et pouvez-vous éviter de coder en dur la racine django, de sorte que/accounts/login se résout en/root/accounts/login si votre application django est déployée sur example.com/root plutôt qu'exemple.com/? – gozzilli

+0

@gozzilli - depuis Django 1.4, j'utiliserais 'reverse_lazy' au lieu d'importer' settings.LOGIN_URL' dans les urls. J'ai mis à jour la réponse. – Alasdair

Questions connexes