首页 > 解决方案 > django 表单没有发布,但页面上的其他表单呢?

问题描述

我在一个页面上有两个表格。第一个表单正确地向我的视图发送了一个 POST 请求,但第二个表单发送了一个 GET(我还需要它来发送一个 POST)。我以前犯过这个错误,这次我确保按钮设置为“提交”,但由于某种原因它仍然发送一个 GET。

表格 1(按预期工作):

<form method="POST">
                {% csrf_token %}
                <div class="row form-row">
                  <div class="col-sm-6">
                    <div class="form-group">
                      <label for="start_date">Start</label>
                      <input class="form-control" type="text" data-flatpickr data-alt-input="true" data-date-format="Y-m-d" name="start_date" data-enable-time="true">
                    </div>
                    <div class="form-group">
                      <label for="end_date">End</label>
                      <input class="form-control" type="text" data-flatpickr data-alt-input="true" data-date-format="Y-m-d" name="end_date" data-enable-time="true">                   
                    </div>
                  </div>
                  </div>
                  <input type="hidden" name="eventtype" value="availability">
                <button class="btn btn-primary" type="submit">Save changes</button>
              </form>

表格 2(发送一个 GET 但我希望这个 POST):

<form method="POST">
  {% csrf_token %}
  {% if form.errors %}{{form.errors}}{% endif %}
  <input type="hidden" name="pk" value="{{ i.id }}">
  <input type="hidden" name="eventtype" value="invite">
  <button class="btn btn-primary" type="submit">Confirm</button>
</form>

视图.py

def createevent(request):
    if request.method == 'GET':
        <<code>>
    else:
        try:
            eventtype = request.POST.get('eventtype', None)
            print(eventtype)
            if eventtype == "availability":
                form = EventForm(request.POST)
                newEvent = form.save(commit=False)
                newEvent.mentor_user = request.user
                newEvent.requester_user = None
                newEvent.notes = None
                newEvent.save()
            elif eventtype == "invite":
                form = EventForm(request.POST)
                updatedEvent = form.save(commit=False)
                updatedEvent.isConfirmed = True
                updatedEvent.save()
            return redirect('createevent')
        except ValueError:
            print(form.errors)
            return render(request, 'events/createevent.html', {'form':EventForm(), 'error':'There was an error. Please make sure you entered everything correctly!'})

网址.py

# Events
path('events/create', views.createevent, name='createevent'),
# path('calendar/<slug:slug>', views.viewevent, name='viewevent'),
path('events/<int:pk>/edit', views.updateevent, name='updateevent'),

表格 1 和表格 2 的控制台输出:

"GET /events/create?csrfmiddlewaretoken=<<redacted>>&pk=2&eventtype=invite HTTP/1.1" 200 25560


"POST /events/create?csrfmiddlewaretoken=<<redacted>>&pk=2&eventtype=invite HTTP/1.1" 302 0

标签: pythondjango

解决方案


问题最终是表单被包装在模板代码中的另一个表单标记中。当我单击提交按钮时,提交按钮在第一个表单而不是第二个表单上触发。只是一个糟糕的复制/粘贴。


推荐阅读