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 <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 <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
相关产品推荐
相关产品推荐

