2015-12-21 17 views
5

Ho un piccolo problema nel capire come funziona {% url 'something' %} nei modelli django.Come ottenere correttamente l'url per la vista di accesso nel modello?

Quando eseguo il mio sito in modalità debug, vedo questo in stdout:

web_1 | [21/Dec/2015 11:29:45] "GET /accounts/profile HTTP/1.1" 302 0 
web_1 | /usr/local/lib/python3.5/site-packages/django/template/defaulttags.py:499: RemovedInDjango110Warning: Reversing by dotted path is deprecated (django.contrib.auth.views.login). 
web_1 | url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app) 
web_1 | 

I/mappe profilo/account a un modello, e l'unico posto in questo modello che cita django.contrib.auth.views.login è il seguente:

<a href="{% url 'django.contrib.auth.views.logout' %}?next={% url 'django.contrib.auth.views.login' %}">Log out</a> 

Quindi, credo che per qualche ragione questo non è il modo corretto di usare il comando {% url%}. Qual è il modo corretto? Come sbarazzarsi di questo avvertimento?

qui sono i miei urlpatterns:

urlpatterns = [ 
    url(r'^admin/', admin.site.urls), 
    url(r'^accounts/', include('django.contrib.auth.urls')), 
    url(r'^accounts/profile', views.profile_view), 
    url(r'^$', RedirectView.as_view(url=reverse_lazy(views.profile_view))) 
] 
+0

nel modello utilizzerà il nome della voce di URL (come definito in 'URL. py') ovvero "Log out" – Pynchia

risposta

7

si dovrebbe utilizzare il nome della URL, invece del suo percorso tratteggiato.

In questo caso, sono stati inclusi i modelli di URL da django.contrib.auth.urls. Se si guarda that urls file, è possibile vedere che il nome delle viste è login e logout.

urlpatterns = [ 
    url(r'^login/$', views.login, name='login'), 
    url(r'^logout/$', views.logout, name='logout'), 
    ... 
] 

Pertanto, cambiare il tuo link a:

<a href="{% url 'logout' %}?next={% url 'login' %}">Log out</a> 
0

Nel urls.py aggiungere il nome a ciascuna voce rilevante (non il quelli che comprendono altre definizioni, come il nome sarebbe stato ignorato)

urlpatterns = [ 
    url(r'^admin/', admin.site.urls), 
    url(r'^accounts/', include('django.contrib.auth.urls')), 
    url(r'^accounts/profile', views.profile_view, name='acc_profile'), 
    url(r'^$', RedirectView.as_view(url=reverse_lazy(views.profile_view)), name='home') 
] 

Poi nei modelli utilizzare il nome della voce dell'URL, come sopra definito, ad esempio

<a href="{% url 'optional_template_namespace:entry_name' %}">The link text</a> 

Nel caso specifico, le login e logout gli URL provengono dallo standard django.contrib.auth.urls e il loro nome è abbastanza semplice (vedi here per ulteriori informazioni)

<a href="{% url 'logout' %}?next={% url 'login' %}">Log out</a> 
1

Dai un'occhiata alla urls.py

url(r'^login/$', views.login, name='login'), 

è possibile fare riferimento al nome quando si utilizza url

{% url 'login' %} 

un ND

{% url 'logout' %} 

o se è necessario il logout con successiva poi

<a href="{% url logout %}?next=/accounts/login/">Logout</a> 

controllare questo post 'django.contrib.auth.views.login'