Django中request.session传值后,form_faculty函数未正确触发
问题诊断与修复方案
你遇到的核心问题是session变量传递后未正确生效,同时代码中存在多个潜在bug导致功能异常。以下是具体修复步骤和修正后的代码:
关键问题分析
- 全局变量滥用:使用
global FIC会导致多用户请求间的数据污染,这是Django视图的严重错误。 - Formset类而非实例传递:模板需要接收Formset实例而非类,否则无法渲染出正确数量的表单。
- 硬编码重定向URL:直接使用字符串重定向可能导致URL解析错误,应使用
reverse()生成正确路径。 - 缺失的session存储:
cdc_name未存入session,导致后续视图无法获取该值。 - 无效表单重定向丢失错误:表单验证失败时重定向会清空用户输入和错误提示,影响体验。
修正后的代码
views.py
from django.shortcuts import render, redirect from django.urls import reverse from django.forms import formset_factory def form_CDC(request): if request.method == 'GET': cdc_name = request.GET.get('data') request.session['cdc_name'] = cdc_name # 将cdc_name存入session form = classForm() return render(request, "homepage/form_CDC.html", context={'form': form, "cdc_name": cdc_name}) if request.method == 'POST': form = classForm(request.POST) if form.is_valid(): # 所有数据存入session,替代全局变量 request.session['FIC'] = form.cleaned_data["FIC"] request.session['Tuts'] = form.cleaned_data["Tutorials"] request.session['Lec'] = form.cleaned_data["Lectures"] request.session['Lab'] = form.cleaned_data["Labs"] # 使用reverse生成正确重定向URL return redirect(reverse('form_Faculty')) else: # 渲染带错误的表单,而非重定向清空数据 cdc_name = request.session.get('cdc_name') return render(request, "homepage/form_CDC.html", context={'form': form, "cdc_name": cdc_name}) def form_faculty(request): submitted = False # 从session获取数据,添加异常处理防止缺失 try: Tutorial_number = request.session["Tuts"] Lab_number = request.session["Lab"] Lecture_Number = request.session["Lec"] FIC = request.session["FIC"] cdc_name = request.session["cdc_name"] except KeyError: # session数据缺失时重定向回初始页面 return redirect(reverse('form_CDC')) Lab_Faculty = [] Tut_Faculty = [] Lec_Faculty = [] # 创建Formset类 LectureFormSet = formset_factory(facultyform1, extra=Lecture_Number) TutFormSet = formset_factory(facultyform2, extra=Tutorial_number) LabFormSet = formset_factory(facultyform3, extra=Lab_number) if request.method == "POST": form_lec = LectureFormSet(request.POST) form_tut = TutFormSet(request.POST) form_lab = LabFormSet(request.POST) if all([form_lec.is_valid(), form_tut.is_valid(), form_lab.is_valid()]): for form1 in form_lec.forms: Lec_Faculty.append(form1.cleaned_data['Faculty']) for form2 in form_tut.forms: Tut_Faculty.append(form2.cleaned_data['Faculty']) for form3 in form_lab.forms: Lab_Faculty.append(form3.cleaned_data['Faculty']) create_file( FIC_name=FIC, cdc=cdc_name, Lecture=Lecture_Number, Tutorial=Tutorial_number, Lab=Lab_number, Faculty_Lab=Lab_Faculty, Faculty_Lec=Lec_Faculty, Faculty_Tut=Tut_Faculty ) return redirect('choose_new_table?submitted=True') # 创建Formset实例传递给模板(关键修复) lecture_formset = LectureFormSet() tut_formset = TutFormSet() lab_formset = LabFormSet() return render(request, 'homepage/facultyForm.html', { 'Lectureformset': lecture_formset, 'Tutformset': tut_formset, 'Labformset': lab_formset, "submitted": submitted })
urls.py(无需修改,确保路径正确)
urlpatterns = [ path('form_CDC',views.form_CDC,name='form_CDC'), path('form_Faculty',views.form_faculty,name='form_Faculty'), ]
核心修复点说明
- Session替代全局变量:所有跨视图传递的数据都存入session,确保每个用户的数据独立,避免多请求冲突。
- Formset实例化:为GET请求创建空的Formset实例,模板才能渲染出对应数量的表单,这是解决"变量未更新"视觉表现的关键。
- 重定向优化:使用
reverse()生成URL,避免硬编码导致的路径错误。 - 错误处理增强:表单验证失败时保留用户输入和错误提示,session缺失时自动重定向到初始页面。
内容的提问来源于stack exchange,提问作者Varad Shinde
相关产品推荐
相关产品推荐

