我在google上找了很多关于如何在模板中使用“url”标签的答案,结果发现很多回复都说“你只要把它插入到模板中,然后把它指向你想要的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文件。我不确定这是为什么。对我来说似乎不对)*
7条答案
按热度按时间ar7v8xwq1#
选择的答案已经过时了,没有其他答案适合我(Django 1.6和[显然]没有注册名称空间)。
Django 1.5及更高版本(来自文档)
警告不要忘记在函数路径或模式名称周围加上引号!
使用命名URL,您可以执行以下操作:
字符串
如果视图接受另一个参数,同样容易
型
t3irkdon2#
您不应该汇入
logout_view
函数,而应该在urls.py
档案中提供字串:所以不是
(r'^login/', login_view),
但
(r'^login/', 'login.views.login_view'),
这是做事的标准方式。然后,您可以使用以下命令访问模板中的URL:
字符串
hjqgdpho3#
确保(django 1.5及更高版本)你把url名称放在引号里,如果你的url带参数,它们应该在引号外面(我花了几个小时才发现这个错误!).
字符串
pprl5pva4#
url
模板标记将参数作为字符串传递,而不是作为函数引用传递给reverse()
。最简单的方法是在视图中添加一个name
:字符串
avwztpqn5#
我遇到同样的问题。
我从文档中发现的,我们应该使用namedspace。
在您的情况下
{% url login:login_view %}
uubf1zoe6#
从你的例子来看,它不应该是
{% url myproject.login.views.login_view %}
和故事结束吗?(将myproject
替换为实际项目名称)6kkfgxo07#
例如,
my_app1/views.py
中有4个视图,如下所示。* 您可以看到文档详细解释URL命名空间:字符串
并且,
my_app1/urls.py
中有两条路径,如下所示:型
并且,
core/urls.py
中有4条路径,如下所示:型
现在,您可以将这些URL命名空间设置为
index.html
中的url标签,如下所示:型