2009-10-05 7 views
35

Alcune delle opzioni nel file di impostazioni di django sono url, ad esempio LOGIN_URL e LOGIN_REDIRECT_URL. È possibile evitare di codificare questi URL e utilizzare invece la mappatura dell'URL inverso? Al momento questo è davvero l'unico posto in cui mi trovo a scrivere gli stessi URL in più posti.Django - usa la mappatura url inversa nelle impostazioni

+2

Ne dubito, poiché 'settings.py' viene caricato prima del modulo URL. Interessato a scoprirlo però. Grande domanda. –

risposta

48

Django 1.5 e successivamente

Come di Django 1.5, LOGIN_URL e LOGIN_REDIRECT_URL accettare modelli di URL con nome. Ciò significa che non è necessario codificare gli url nelle impostazioni.

LOGIN_URL = 'login' # name of url pattern 

Per Django 1,5-1,9, è anche possibile utilizzare il nome della funzione vista, ma questo non è raccomandato perché è deprecato in Django 1.8 e non funzionerà in Django 1.10+.

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

Django 1.4

per Django 1.4, è possibile potrebbe usare reverse_lazy

LOGIN_URL = reverse_lazy('login') 

Django 1.3 e precedenti

questa è la risposta originale, che ha lavorato prima di reverse_lazy è stato aggiunto al Django

In url s.py, impostazioni di importazione:

from django.conf import settings 

Quindi aggiungere il modello URL

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

Nota che è necessario tagliare LOGIN_URL per rimuovere la conduce in avanti barra.

Nella shell:

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

Ah, buona soluzione, non ho considerato di andare dalle impostazioni -> URL, solo il contrario. +1 –

+0

E si può evitare l'hard-coding della root di django, in modo che/accounts/login si risolva in/root/accounts/login se la tua app django è distribuita su example.com/root piuttosto example.com/? – gozzilli

+0

@gozzilli: da Django 1.4, userei 'reverse_lazy' invece di importare' settings.LOGIN_URL' negli URL. Ho aggiornato la risposta. – Alasdair

Problemi correlati