首页 > 解决方案 > Django模板第二表单输入触发错误视图

问题描述

试图在一个页面上有两个表单并让用户选择创建输入或加载输入。应该很直截了当。似乎不起作用。每当我单击选择一个人并单击加载时,它都会评估创建的第一个 URL。有人可以指出我缺少什么吗?我确定这很简单。

意见:

def Create(request):
    print('Create View')

def Load(request):
    print('Load View')

网址:

urlpatterns = [
    path('', views.Index, name='index'),
    path('person/', views.Create, name='Create'),
    path('person/', views.Load, name='Load'),

模板:

{% block body_main %}
<form action={% url 'Create' %} method='POST'>
<h2>Name</h2>
    {% csrf_token %}
    {{ form1 }}
<input class="btn btn-success" name="form1btn" value="Submit" type="submit"/>
</form>
<br>
<form action={% url 'Load' %} method='POST'>
<h2>Select Existing Name</h2>
    {% csrf_token %}
    {{ form2 }}
<input class="btn btn-success" name="form2btn" value="Submit" type="submit"/>
<form>
{% endblock %}

标签: django

解决方案


这是问题所在(在Django URL 文档的第 3 点中也提到过:

 path('person/', views.Create, name='Create'),
 path('person/', views.Load, name='Load'),

每次 django URL 匹配器到达这里时,它通常会Create先命中并返回。

Django 按顺序遍历每个 URL 模式,并在与请求的 URL 匹配的第一个模式处停止,与 path_info 匹配。

所以它总是会返回Create视图。

为了解决这个问题,我建议创建 3 个更易读的独立 URL:

 path('person/new', views.Create, name='Create'),
 path('person/load', views.Load, name='Load'),

推荐阅读