使用{%url ??? %}在Django模板

我已经看了很多关于如何在模板中使用'url'标签的谷歌寻找答案,以find许多答复说'你只需将其插入到您的模板,并指出你想要的url视图'。 那么对我来说没有喜悦:(我已经尝试了每一个可能的排列方式,并已经在这里作为最后的手段张贴。

所以在这里。 我的urls.py看起来像这样:

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.contrib 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.contrib.admindocs' # to INSTALLED_APPS to enable admin documentation: # (r'^admin/doc/', include('django.contrib.admindocs.urls')), # Uncomment the next line to enable the admin: (r'^admin/', include(admin.site.urls)), #(r'^static/(?P<path>.*)$', 'django.views.static.serve',{'document_root': '/home/arthur/Software/django/weclaim/templates/static'}), (r'^static/(?P<path>.*)$', 'django.views.static.serve',{'document_root': settings.MEDIA_ROOT}), ) 

我的“login”目录中的“views.py”如下所示:

 from django.shortcuts import render_to_response, redirect from django.template import RequestContext from django.contrib 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)) 

最后是login_view点的main.html:

 <html> <body> test! <a href="{% url logout_view %}">logout</a> </body> </html> 

那么为什么我每次都得到“NoReverseMatch”?

*(略有不同的说明,我不得不在所有我的渲染到响应结束时使用'context_instance = RequestContext(request)',否则它将无法识别我的模板中的{{MEDIA_URL}},我无法引用任何CSS或JS文件。我不确定这是为什么。似乎不正确的我)*

而不是导入logout_view函数,你应该在你的urls.py文件中提供一个string:

所以不(r'^login/', login_view),

但是(r'^login/', 'login.views.login_view'),

这是做事的标准方式。 然后,您可以使用以下方式访问模板中的url:

 {% url login.views.login_view %} 

选定的答案已过时,没有人为我工作(Django 1.6和[平滑]没有注册的命名空间。)

对于Django 1.5及更高版本(来自文档 )

警告不要忘记在函数path或模式名称周围加引号!

用一个命名的URL你可以做:

 (r'^login/', login_view, name='login'), ... <a href="{% url 'login' %}">logout</a> 

如果视图需要另一个参数,就如同一样简单

 def login(request, extra_param): ... <a href="{% url 'login' 'some_string_containing_relevant_data' %}">login</a> 

请确保(django 1.5及以上),你把url名称引号,如果你的url需要参数,他们应该在引号之外 (我花了几个小时搞清楚这个错误!)。

 {% url 'namespace:view_name' arg1=value1 arg2=value2 as the_url %} <a href="{{ the_url }}"> link_name </a> 

url模板标签将以stringforms传递参数,而不是作为reverse()的函数引用。 让这个工作最简单的方法是给视图添加一个name

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

我遇到了同样的问题。

我从文档中发现,我们应该使用namedspace。

在你的情况{% url login:login_view %}

从你的例子来看,不应该是{% url myproject.login.views.login_view %}和结尾? (用您的实际项目名称replacemyproject