Django中实现两个独立表单的单独验证与提交解决方案咨询
Django中实现两个独立表单的单独验证与提交解决方案咨询
我看了你的代码和问题描述,核心问题是提交其中一个表单时,两个表单都会被触发验证,导致出现不必要的错误提示。这主要是因为表单初始化逻辑和模板提交按钮的设置没配合好,下面一步步给你解决:
1. 先搞定模板的表单结构(最关键的一步)
你没贴模板代码,但这是问题的源头之一:每个表单的提交按钮必须带有唯一的name属性,和你后端判断的字符串对应上,这样后端才能识别到底是哪个表单发起的请求。
给你一个模板示例,每个表单要包裹在独立的<form>标签里,提交按钮加上对应name:
<!-- 第一个分类表单 --> <form method="POST"> {% csrf_token %} {{ form_category_1.as_p }} <button type="submit" name="form_category_1">提交分类</button> </form> <!-- 第二个GPR表单 --> <form method="POST"> {% csrf_token %} {{ form_2.as_p }} <button type="submit" name="form_2">提交GPR数据</button> </form>
注意每个表单都要加{% csrf_token %},这是Django的安全要求,绝对不能少。
2. 调整views.py的表单初始化逻辑
你现在的代码在判断POST请求之前就把两个表单都用request.POST or None初始化了,这就导致不管提交哪个表单,另一个表单也会读取POST数据(但POST里没有它的字段),从而触发验证错误。
修改成下面的逻辑,确保只有被提交的表单才用request.POST初始化,另一个表单直接空初始化:
def book(request, pk): context = {} # --- 你的原有数据处理代码(删除旧数据、保存Category_pk_for_form_maim的部分)保持不变 --- Category_pk_for_form_maim.objects.all().delete() filter_qs_category = Category_pk_for_form_category.objects.filter(name_object=pk) filter_qs_category = filter_qs_category.values("category_name") for item in filter_qs_category: entry = item new_entry = Category_pk_for_form_maim(categoty_name=entry) new_entry.save() # --- 调整表单初始化逻辑 --- if request.method == 'POST': if "form_category_1" in request.POST: # 只初始化当前提交的表单,另一个表单空初始化 form_category_1 = Category_pk_for_form_category_Form(request.POST) form_2 = Form_GPR() if form_category_1.is_valid(): # 简化保存逻辑,不用手动创建new_entry model_instance = form_category_1.save(commit=False) model_instance.name_object = pk model_instance.save() return redirect("book-detail", pk) elif "form_2" in request.POST: form_2 = Form_GPR(request.POST) form_category_1 = Category_pk_for_form_category_Form() if form_2.is_valid(): model_instance = form_2.save(commit=False) model_instance.name_object = pk model_instance.save() return redirect("book-detail", pk) else: # GET请求时,两个表单都空初始化 form_category_1 = Category_pk_for_form_category_Form() form_2 = Form_GPR() # --- 你的原有上下文数据处理代码保持不变 --- book = get_object_or_404(ArkiObject_1, pk=pk) filter_qs = CreateNewGPR.objects.filter(name_object=pk).values( "name_working", "type_izm", "value_work", "lyudi_norma", "technik_norma", "date_begin", "date_end" ) context['books'] = filter_qs context['form_category_1'] = form_category_1 context['form_2'] = form_2 return render(request, 'bookdetail.html', context)
这样修改后,提交第一个表单时,form_2是全新的空表单,不会触发验证;提交第二个表单时同理,form_category_1是空的,不会有验证错误。
3. 修正models.py的小错误
我注意到你models.py里有个字段拼写错了:
lyudi_norma = models.IntegerFiel
少了最后一个d,应该改成models.IntegerField(),不然会报语法错误,这个也要修正哦。
最后验证效果
做完上面三步后,再测试一下:
- 提交第一个表单,只会验证form_category_1,成功后跳转,不会出现第二个表单的错误
- 提交第二个表单,只会验证form_2,同理不会有第一个表单的错误
- 空提交某个表单时,只会显示当前表单的验证错误,另一个表单保持空白状态
内容来源于stack exchange
相关产品推荐
相关产品推荐

