Utiliser {% url ??? %} dans les modèles de django

J’ai beaucoup cherché sur google comment utiliser la balise ‘url’ dans les modèles uniquement pour trouver de nombreuses réponses disant ‘Il suffit de l’insérer dans votre modèle et de le pointer vers la vue pour laquelle vous voulez l’URL’. Eh bien, pas de joie pour moi 🙁 J’ai essayé toutes les permutations possibles et j’ai eu recours à poster ici en dernier recours.

Alors voilà. Mon urls.py ressemble à ceci:

from django.conf.urls.defaults import * from login.views import * from mainapp.views import * import settings # Uncomment the next two lines to enable the admin: from django.consortingb import admin admin.autodiscover() urlpatterns = patterns('', # Example: # (r'^weclaim/', include('weclaim.foo.urls')), (r'^login/', login_view), (r'^logout/', logout_view), ('^$', main_view), # Uncomment the admin/doc line below and add 'django.consortingb.admindocs' # to INSTALLED_APPS to enable admin documentation: # (r'^admin/doc/', include('django.consortingb.admindocs.urls')), # Uncomment the next line to enable the admin: (r'^admin/', include(admin.site.urls)), #(r'^static/(?P.*)$', 'django.views.static.serve',{'document_root': '/home/arthur/Software/django/weclaim/templates/static'}), (r'^static/(?P.*)$', 'django.views.static.serve',{'document_root': settings.MEDIA_ROOT}), ) 

Mon “views.py” dans mon répertoire “login” ressemble à ceci:

 from django.shortcuts import render_to_response, redirect from django.template import RequestContext from django.consortingb import auth def login_view(request): if request.method == 'POST': uname = request.POST.get('username', '') psword = request.POST.get('password', '') user = auth.authenticate(username=uname, password=psword) # if the user logs in and is active if user is not None and user.is_active: auth.login(request, user) return render_to_response('main/main.html', {}, context_instance=RequestContext(request)) #return redirect(main_view) else: return render_to_response('loginpage.html', {'box_width': '402', 'login_failed': '1',}, context_instance=RequestContext(request)) else: return render_to_response('loginpage.html', {'box_width': '400',}, context_instance=RequestContext(request)) def logout_view(request): auth.logout(request) return render_to_response('loginpage.html', {'box_width': '402', 'logged_out': '1',}, context_instance=RequestContext(request)) 

et enfin le main.html auquel les points login_view ressemblent:

   test! logout   

Alors, pourquoi est-ce que je reçois ‘NoReverseMatch’ à chaque fois?

* (sur une note légèrement différente, j’ai dû utiliser ‘context_instance = RequestContext (request)’ à la fin de tous mes rendus de réponse car sinon, il ne reconnaîtrait pas {{MEDIA_URL}} dans mes modèles et je ne pourrais pas me référer tous les fichiers css ou js. Je ne suis pas sûr de savoir pourquoi. Cela ne me semble pas correct) *

Au lieu d’importer la fonction logout_view , vous devez fournir une chaîne dans votre fichier urls.py :

Donc pas (r'^login/', login_view),

mais (r'^login/', 'login.views.login_view'),

C’est la manière standard de faire les choses. Ensuite, vous pouvez accéder à l’URL dans vos modèles en utilisant:

 {% url login.views.login_view %} 

La réponse sélectionnée est obsolète et personne d’autre n’a travaillé pour moi (Django 1.6 et [apparemment] aucun espace de noms enregistré.)

Pour Django 1.5 et ultérieur (à partir des documents )

Attention N’oubliez pas de mettre des guillemets autour du chemin de la fonction ou du nom du motif!

Avec une URL nommée, vous pouvez faire:

 (r'^login/', login_view, name='login'), ... logout 

Tout aussi facile si la vue prend un autre paramètre

 def login(request, extra_param): ... login 

Assurez-vous (django 1.5 et au-delà) de mettre le nom de l’URL entre guillemets et si votre URL prend des parameters, ils doivent être en dehors des guillemets (j’ai passé des heures à comprendre cette erreur!).

 {% url 'namespace:view_name' arg1=value1 arg2=value2 as the_url %}  link_name  

La balise url template transmettra le paramètre en tant que chaîne et non en tant que référence de fonction à reverse() . La manière la plus simple de faire fonctionner ceci est d’append un name à la vue:

 url(r'^/logout/' , logout_view, name='logout_view') 

Je rencontre le même problème.

Ce que j’ai trouvé dans la documentation, nous devrions utiliser namedspace.

dans votre cas {% url login:login_view %}

D’après votre exemple, ne devrait-il pas s’agir de {% url myproject.login.views.login_view %} et de la fin de l’histoire? (remplacez mon projet par le nom de votre projet)