1

HTML 表单:

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

注意 arg 'project_name' 的值是 'lion'

视图.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))   

网址.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”。知道为什么会这样吗?

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

4

1 回答 1

1

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

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

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

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

johndoelionsave

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

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

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

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

johndoe/lion/save

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

于 2013-05-29T04:59:23.413 回答