Django urls关键字

时间:2013-07-12 16:59:02

标签: python django url

使用以下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})

但是,有更快的方法吗?

1 个答案:

答案 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参数。