使用以下Django代码时,在将url关键字传递给模板时遇到问题。
views.py
def index(request,username):
return render(request,'myaccount.html')
来自projectname文件夹的urls.py
urlpatterns = patterns('',
url(r'^myaccount/',include('myaccount.urls')),
)
来自myaccount app的urls.py
urlpatterns = patterns('',
url(r'^(?P<username>[a-zA-Z0-9]+)/$','myaccount.views.index',name='myaccount'),
)
问题是,为什么当我使用以下html代码时,它会显示 / myaccount / Jerry /
myaccount.html
{% url 'myaccount' 'Jerry' %}
但是当我传递关键字时会显示错误
myaccount.html
{% url 'myaccount' username %}
NoReverseMatch at /myaccount/Jerry/
Reverse for 'myaccount' with arguments '('',)' and keyword arguments '{}' not found.
当我传递变量用户名时错误得到修复:
def index(request,username):
return render(request,'myaccount.html',{'username':username})
但是,有更快的方法吗?
答案 0 :(得分:1)
在你的正则表达式中,你正在捕获一个键/值对,其中键等于用户名。您需要在网址标记中指定username ='Jerry'。
P&lt;用户名&gt;表示捕获以下内容并将其链接到名为username的关键字。
{% url 'myaccount' username='Jerry' %}
因此,在您的情况下,如果您没有为Reverse查找提供关键字参数,它将查找不存在的正则表达式模式。
修改强>
这可能会解决您的“更快捷方式”问题。您应该尝试使用基于类的视图。见https://docs.djangoproject.com/en/1.5/ref/class-based-views/base/#django.views.generic.base.TemplateView
如果要使用网址模式 - >
url(r'^(?P<somenumber>\d+)/test/$', views.TestView.as_view(), name='testview')
其中TestView在views.py中定义为(确保在url.py中导入视图)
from django.views.generic import TemplateView
class TestView(TemplateView):
model = xxxx // link to your model here
template_name = 'test.html'
在test.html模板中,您只需执行此操作
{{ somenumber }}
提取传入参数的值。
TemplateView的get_context_data(self,** kwargs)函数将自动更新模板的上下文,以包含在您的url模式中找到的任何键/值对参数。
实际上,您可以覆盖此函数并调用super来更新模板上下文中所需的任何自定义k / w参数。