1

使用以下 Django 代码,我在将 url 关键字传递给模板时遇到问题。

视图.py

def index(request,username):
    return render(request,'myaccount.html')

来自 projectname 文件夹的 urls.py

urlpatterns = patterns('',
    url(r'^myaccount/',include('myaccount.urls')),
)

来自 myaccount 应用程序的 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})

但是,有没有更快的方法?

4

1 回答 1

2

在您的正则表达式中,您正在捕获一个键/值对,其中键等于用户名。您需要在 url 标签中指定 username='Jerry' 。

P < username > 表示捕获以下内容并将其链接到名为 username 的关键字。

{% url 'myaccount' username='Jerry' %}

因此,在您的情况下,如果您没有为反向查找提供关键字参数,它将查找不存在的正则表达式模式。

编辑

这可能会解决您对“更快方式”的担忧。您应该尝试使用基于类的视图。请参阅https://docs.djangoproject.com/en/1.5/ref/class-based-views/base/#django.views.generic.base.TemplateView

如果要使用 url 模式->

    url(r'^(?P<somenumber>\d+)/test/$', views.TestView.as_view(), name='testview')

TestView 在 vi​​ews.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 参数。

于 2013-07-12T17:05:49.403 回答