使用{%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
)