使用以下 Django 代码,我在将 url 关键字传递给模板时遇到问题。
View .py
def index(request,username):
return render(request,'myaccount.html')
来自项目名称文件夹的 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})
但是,有没有更快的方法呢?
最佳答案
在您的正则表达式中,您正在捕获一个键/值对,其中键等于用户名。您需要在 url 标记中指定 username='Jerry'。
P < username > 表示捕获以下内容并将其链接到名为 username 的关键字。
{% url 'myaccount' username='Jerry' %}
因此,在您的情况下,如果您没有为反向查找提供关键字参数,它将查找不存在的正则表达式模式。
编辑
这可能会解决您的“更快的方式”问题。您应该尝试使用基于类的 View 。请参阅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 在views.py 中定义为(请务必在您的url.py 中导入 View )
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 参数。
关于python - Django url 关键字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17620172/