只有一个字符串的字符串从模板传递给Django视图函数

时间:2013-05-29 02:23:41

标签: django django-templates django-views

HTML表单:

<form id="save_form" method="post" action="{% url 'project_save' usernames=username project_name='lion' %}">

注意arg'project_name的值是'lion'

views.py:

def projectz_save(request, usernames, project_name):
    template = loader.get_template('project_view/index.html')
    context = RequestContext(request, {"username": usernames, "project": project_name})
    return HttpResponse(template.render(context))   

urls.py:

urlpatterns = patterns('',
url(r'^$', views.index, name='index'),
url(r'^(?P<usernames>\w+)(?P<project_name>\w+)save$', views.projectz_save, name='project_save'),
)

只会将'lion'中的'n'作为参数传递。当我重新渲染页面时,模板变量“project”现在具有值'n'而不是'lion'。知道为什么会这样吗?

如果我使用变量而不是字符串(这显然是最终目标)会发生这种情况,但即使简化为简单的字符串,它仍然会发生。

1 个答案:

答案 0 :(得分:1)

您的问题是,当模板正确构建URL时,您的urls.py regexp太贪婪了。

具体来说,您的名为group的用户名与名为group的项目名称之间没有分隔符:

r'^(?P<usernames>\w+)(?P<project_name>\w+)save$'

给定任何单词字符序列,除了最后一个字符之外的所有字符都将由用户名组中的\w+匹配。最后一个将与project_name组匹配,因为+至少需要一个字符。因此,如果模板中的用户名为“johndoe”,则url标记将构建网址:

johndoelionsave

然后,正则表达式将匹配johndoelio作为用户名组,因为所有这些都由\w+n匹配为project_name组,因为它与\w+匹配,然后是固定的save和字符串结尾部分。

您最好的解决方法是分解URL模式,以便解析明确无误。我建议:

r'^(?P<usernames>\w+)/(?P<project_name>\w+)/save$'

在这种情况下,模板标签将产生:

johndoe/lion/save

并且正则表达式将解析您想要的详细信息。