You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django表单始终使用GET而非POST请求的问题求助

问题描述

我学习Django已有3个月,正在开发一个在线简历生成网站,但调用views.py中的函数时,始终获取到GET请求,而非预期的POST请求,怀疑是前端存在问题。我使用Nicepage生成的HTML代码作为前端,但无法解决该问题,附上相关代码请求协助排查:


前端代码

<section class="u-clearfix u-section-1" id="sec-800b">
<div class="u-clearfix u-sheet u-valign-top u-sheet-1">
    <div class="u-container-style u-expanded-width u-group u-image u-image-default u-image-1" data-image-width="360"
         data-image-height="360">
        <div class="u-container-layout u-container-layout-1">
            <h2 class="u-text u-text-default u-text-1">Let's start with&nbsp;<br>personal information
            </h2>
            <div class="u-expanded-width-sm u-expanded-width-xs u-form u-form-1">
                <form enctype="multipart/form-data" method="POST"
                      class="u-clearfix u-form-spacing-10 u-form-vertical u-inner-form"
                      style="padding: 10px;">
                    {% csrf_token %}
                    <div class="u-form-group u-form-name">
                        {{ form.as_p }}
                        <!--                            <label for="name-86ce" class="u-label">Fullname</label>-->
                        <!--                            <input type="text" placeholder="Enter your fullname carefully..." id="name-86ce" name="name"-->
                        <!--                                   class="u-border-1 u-border-grey-30 u-input u-input-rectangle u-white" required>-->
                    </div>
                    <div class="u-form-email u-form-group">
                        <label for="email-86ce" class="u-label">Email</label>
                        <input type="email" placeholder="Enter a valid email address" id="email-86ce" name="email"
                               class="u-border-1 u-border-grey-30 u-input u-input-rectangle u-white" required="">
                    </div>
                    <div class="u-form-group u-form-phone u-form-group-3">
                        <label for="phone-9974" class="u-label">Phone</label>
                        <input type="tel"
                               pattern="\+?\d{0,3}[\s\(\-]?([0-9]{2,3})[\s\)\-]?([\s\-]?)([0-9]{3})[\s\-]?([0-9]{2})[\s\-]?([0-9]{2})"
                               placeholder="Enter your phone (e.g. +14155552675)" id="phone-9974" name="phone"
                               class="u-border-1 u-border-grey-30 u-input u-input-rectangle u-white" required="">
                    </div>
                    <div class="u-form-group u-form-partition-factor-2 u-form-group-4">
                        <label for="text-d550" class="u-label">Address</label>
                        <input type="text" placeholder="enter your address..." id="text-d550" name="text"
                               class="u-border-1 u-border-grey-30 u-input u-input-rectangle u-white">
                    </div>
                    <div class="u-form-group u-form-partition-factor-2 u-form-group-5">
                        <label for="text-10ad" class="u-label">Postal code</label>
                        <input type="text" placeholder="ex. New York - 10001" id="text-10ad" name="text-1"
                               class="u-border-1 u-border-grey-30 u-input u-input-rectangle u-white">
                    </div>
                    <div class="container">
                        <a href="{% url 'template' %}"
                           class="u-btn u-btn-round u-btn-submit u-button-style u-radius-11 u-btn-1">Back<br>
                        </a>
                    </div>
                    <div class="u-form-send-message u-form-send-success"> Thank you! Your message has been sent.
                    </div>
                    <div class="u-form-send-error u-form-send-message"> Unable to send your message. Please fix
                        errors then try again.
                    </div>
                    <input type="hidden" value="" name="recaptchaResponse">
                    <input type="hidden" name="formServices" value="40a3b58402a1a2984520a20649102ef7">
                </form>
            </div>
            <a href="{% url 'work_experience' %}"
               class="u-btn u-btn-round u-button-style u-hover-feature u-hover-palette-1-light-2 u-radius-7 u-btn-2"
               data-animation-name="pulse" data-animation-duration="1000"
               data-animation-direction="">Next                </a>
            <img class="u-image u-image-circle u-preserve-proportions u-image-2"
                 src="{% static 'images/images.jfif' %}" alt=""
                 data-image-width="201" data-image-height="251">
            <h4 class="u-text u-text-2">We ensure that your ​​personal&nbsp;<br>information won't store anywhere!
            </h4>
        </div>
    </div>
</div>

urls.py

from django.urls import path
from .views import (
    index,
    start_building,
    template_choice,
    testing,
    work_experience,
    education,
    skills_summary
)

prefix = 'v1/requests/'
urlpatterns = [
    path("", index, name="homepage"),
    path("test/", testing, name="testing"),
    path(prefix + "education/", education, name="education"),
    path(prefix + "skills_summary/", skills_summary, name="finish"),
    path(prefix + "work_experience/", work_experience, name="work_experience"),
    path(prefix + "template_choice/", template_choice, name="template"),
    path(prefix + "starter/", start_building, name="start_process"),
]

views.py

from django.shortcuts import render
from .forms import PersonalDetailsForm, SingleForm
from django.http import HttpResponseRedirect

personal_details = []


def index(request):
    a = "We have got more than 50000 users used our website!"
    return render(request, "Home.html", {"a": a})


def template_choice(request):
    return render(request, "template_choice.html", {})


def start_building(request):
    print("[INFO]: function start__building is working!")
    form = PersonalDetailsForm(request.POST)
    print(request.method)
    if request.method == "POST":
        print(True)
        if form.is_valid():
            fullname = form.cleaned_data["fullname"]
            print(fullname)
    return render(request, "Page-1.html", {"form": form})


def work_experience(request):
    return render(request, "Page-2.html", {})


def education(request):
    return render(request, "education.html", {})


def skills_summary(request):
    return render(request, "skills_summary.html", {})


def testing(request):
    form = PersonalDetailsForm(request.POST)
    if request.method == "POST":
        if form.is_valid():
            data = form.cleaned_data["fullname"]
            print(data)
    return render(request, "formsets.html", {"form": form})
def work_experience(request):
    return render(request, "Page-2.html", {})


def education(request):
    return render(request, "education.html", {})


def skills_summary(request):
    return render(request, "skills_summary.html", {})


def testing(request):
    form = PersonalDetailsForm(request.POST)
    if request.method == "POST":
        if form.is_valid():
            data = form.cleaned_data["fullname"]
            print(data)
    return render(request, "formsets.html", {"form": form})

forms.py

from django import forms
 
 
class SingleForm(forms.Form):
     single = forms.CharField(required=False)
 
 
class MyForm(forms.Form):
     original_field = forms.CharField()
     extra_field_count = forms.CharField(widget=forms.HiddenInput())
 
     def __init__(self, *args, **kwargs):
         extra_fields = kwargs.pop('extra', 0)
 
         super(MyForm, self).__init__(*args, **kwargs)
         self.fields['extra_field_count'].initial = extra_fields
 
         for index in range(int(extra_fields)):
             # generate extra fields in the number specified via extra_fields
             self.fields['extra_field_{index}'.format(index=index)] = \
                 forms.CharField()
 
 
class PersonalDetailsForm(forms.Form):
    fullname = forms.CharField(
        max_length=50,
        required=False,
        widget=forms.TextInput(
            attrs={
                "class": "u-border-1 u-border-grey-30 u-input u-input-rectangle uwhite",
                "placeholder": "Enter your fullname carefully...",
                "id": "name-86ce",
            }
        )
    )

问题排查与修复方案

1. 前端核心问题:无表单提交按钮,"Next"为GET跳转

你的表单里没有<input type="submit">或<button type="submit">按钮,当前的"Next"是<a>标签,点击只会发起GET请求跳转,根本不会提交表单数据。

修复方法:

  • 在form标签内添加提交按钮,同时指定表单提交的目标路由:
<!-- 在表单隐藏字段前添加提交按钮 -->
<button type="submit" class="u-btn u-btn-round u-button-style u-hover-feature u-hover-palette-1-light-2 u-radius-7 u-btn-2">提交并下一步</button>
  • 给form标签添加action属性,确保提交到正确的视图:
<form enctype="multipart/form-data" method="POST" action="{% url 'start_process' %}"
      class="u-clearfix u-form-spacing-10 u-form-vertical u-inner-form"
      style="padding: 10px;">

2. 视图函数逻辑错误

  • GET请求时不能用request.POST初始化表单,否则会绑定空数据,导致表单验证异常:
def start_building(request):
    print("[INFO]: function start_building is working!")
    if request.method == "POST":
        form = PersonalDetailsForm(request.POST)
        print(request.method)
        if form.is_valid():
            fullname = form.cleaned_data["fullname"]
            print(fullname)
            # 提交成功后重定向到下一页
            return HttpResponseRedirect(reverse('work_experience'))
    else:
        # GET请求初始化空表单
        form = PersonalDetailsForm()
    return render(request, "Page-1.html", {"form": form})
  • 删除views.py中重复定义的work_experience、education等函数,避免代码冗余。

3. 表单字段不匹配问题

前端手动添加的email、phone等字段未在PersonalDetailsForm中定义,提交后无法通过Django表单验证。需更新表单类,将这些字段加入:

class PersonalDetailsForm(forms.Form):
    fullname = forms.CharField(
        max_length=50,
        required=False,
        widget=forms.TextInput(
            attrs={
                "class": "u-border-1 u-border-grey-30 u-input u-input-rectangle u-white",
                "placeholder": "Enter your fullname carefully...",
                "id": "name-86ce",
            }
        )
    )
    email = forms.EmailField(
        required=True,
        widget=forms.EmailInput(
            attrs={
                "class": "u-border-1 u-border-grey-30 u-input u-input-rectangle u-white",
                "placeholder": "Enter a valid email address",
                "id": "email-86ce",
            }
        )
    )
    phone = forms.CharField(
        required=True,
        widget=forms.TextInput(
            attrs={
                "class": "u-border-1 u-border-grey-30 u-input u-input-rectangle u-white",
                "placeholder": "Enter your phone (e.g. +14155552675)",
                "id": "phone-9974",
                "pattern": r"\+?\d{0,3}[\s\(\-]?([0-9]{2,3})[\s\)\-]?([\s\-]?)([0-9]{3})[\s\-]?([0-9]{2})[\s\-]?([0-9]{2})"
            }
        )
    )
    address = forms.CharField(
        required=False,
        widget=forms.TextInput(
            attrs={
                "class": "u-border-1 u-border-grey-30 u-input u-input-rectangle u-white",
                "placeholder": "enter your address...",
                "id": "text-d550",
            }
        )
    )
    postal_code = forms.CharField(
        required=False,
        widget=forms.TextInput(
            attrs={
                "class": "u-border-1 u-border-grey-30 u-input u-input-rectangle u-white",
                "placeholder": "ex. New York - 10001",
                "id": "text-10ad",
            }
        )
    )

之后前端只需保留{{ form.as_p }},删除手动编写的input标签,确保字段与表单类一致。

内容的提问来源于stack exchange,提问作者user18519195

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 00:05:32