【问题标题】:How to have single view for multiple HTML forms - Django如何为多个 HTML 表单提供单一视图 - Django
【发布时间】:2026-01-05 21:55:01
【问题描述】:

这是我的观点。所以我想在同一个视图中保留 2 个不同的 HTML 表单,但是我无法这样做,因为每当我添加 1 个表单时,我都会收到其他表单不存在的错误。

def home(request):
    name = None
    if request.method == 'POST':
        name = request.POST.get('name')
        choices = request.POST.get('choices')
        subtest = request.POST.get('subtest')
        reference = request.POST.get('reference')
        unit = request.POST.get('unit')
        test = Test()
        test.name = name
        test.save()
        subtest = Subtest()
        subtest.test = Test.objects.get(name=choices)
        subtest.name = subtest
        subtest.unit = unit
        subtest.reference_value = reference
        subtest.save()
        # print(name)
        return redirect('home')
    return render(request,'main.html',{}) 

我有两种不同的形式。我没有使用 django 表单,因为我想尝试一些新的东西。

我的第一个表格

<form method="POST">
        {% csrf_token %}
        <div class="icon-holder">
          <i data-modal-target="test-popup" class="icon-cross"></i>
        </div>
        <div class="input-group">
          <input type="text" name="name" placeholder="Test name" />
        </div>
        <div class="button-group">
          <button type="submit">Submit</button>
        </div>
      </form>

我的第二个表格

<form method="POST">
        {% csrf_token %}
        <div class="icon-holder">
          <i data-modal-target="menu-test-popup" class="icon-cross"></i>
        </div>
        <div class="input-group">
          <label for="test-select">Test Name:</label>
          <select name="choices" id="test-select">
            {% for test in test %}
            <option value="{{test.name}}" name='choices'>{{test.name|title}}</option>
            {% endfor %}
          </select>
        </div>
        <div class="input-group">
          <input type="text" name="subtest" placeholder="SubTest name" />
        </div>
        <div class="input-group">
          <input type="text" name="reference" placeholder="Reference rate" />
        </div>
        <div class="input-group">
          <input type="text" name="unit" placeholder="Unit" />
        </div>
        <div class="button-group">
          <button type="submit">Submit</button>
        </div>
      </form>

【问题讨论】:

  • 你能告诉我你面临的错误吗
  • @Lag11 IntegrityError at / NOT NULL 约束失败:lab_test.name

标签: python html django forms


【解决方案1】:

第一种形式

<form method="POST">
...
<input name="form_type" value="first-form" type="hidden">
</form>

第二种形式

<form method="POST">
...
<input name="form_type" value="second-form" type="hidden">
</form>

查看功能

def view(request):
  if method == "POST":

    form_type = request.POST.get('form_type')

    if form_type == "first-form":
      # first form's process
    elif form_type == "second-form":  
      #second form's process

【讨论】:

  • 我已经这样做了。我想要一些新的东西,比如 django 表单,我们可以有 2 个具有 1 个视图和 1 个 url 的表单
  • 然后在两个表单中添加名为“form_type”的额外隐藏输入,其中一个的值为“first-form”,另一个为“second-value”。form_type = request.POST.get('form_type') if form_type == "first-form": #Do first form process else: # Do second form process
  • 你能给我解释一下并写一些代码吗?这意味着很多
【解决方案2】:

您在这里有两个表单,当您提交第二个表单时,只有第二个表单中的字段被提交。

从这一行开始

name = request.POST.get('name')

名称将变为无。但我相信您的 Test 模型没有为 name 字段采用任何 None 值(您的原因是“IntegrityError at / NOT NULL constraint failed: lab_test.name”)。

要克服这个问题,首先检查 'name' 是否有任何值,然后继续创建测试实例

if name:
    test = Test()
    test.name = name
    test.save()

在创建和保存实例之前,同样检查第二个表单是否存在其他字段。

【讨论】:

  • 让我分解一下 senario.. 我有 2 种不同的 Html 表单。我想要一个视图和一个 url。因此,如果我提交 1 个视图当然另一个是无。
  • 是的,所以在创建实例之前检查数据是否存在,因为您的测试模型无法将名称保存为无
  • 当我提交第二个表单时,我对第一个表单没有任何价值,这会引发错误。当我们填写其他表格时,有什么办法可以忽略一张表格
  • 这正是我在答案中提到的,“如果名称:”首先检查名称中是否有任何值(如果提交第二个表单,它将是 None )。当且仅当名称具有某个值时(提交第一个表单时),才会创建并保存测试实例
最近更新 更多