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

Django中request.session传值后,form_faculty函数未正确触发

问题诊断与修复方案

你遇到的核心问题是session变量传递后未正确生效,同时代码中存在多个潜在bug导致功能异常。以下是具体修复步骤和修正后的代码:

关键问题分析

  1. 全局变量滥用:使用global FIC会导致多用户请求间的数据污染,这是Django视图的严重错误。
  2. Formset类而非实例传递:模板需要接收Formset实例而非类,否则无法渲染出正确数量的表单。
  3. 硬编码重定向URL:直接使用字符串重定向可能导致URL解析错误,应使用reverse()生成正确路径。
  4. 缺失的session存储:cdc_name未存入session,导致后续视图无法获取该值。
  5. 无效表单重定向丢失错误:表单验证失败时重定向会清空用户输入和错误提示,影响体验。

修正后的代码

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'),
]

核心修复点说明

  1. Session替代全局变量:所有跨视图传递的数据都存入session,确保每个用户的数据独立,避免多请求冲突。
  2. Formset实例化:为GET请求创建空的Formset实例,模板才能渲染出对应数量的表单,这是解决"变量未更新"视觉表现的关键。
  3. 重定向优化:使用reverse()生成URL,避免硬编码导致的路径错误。
  4. 错误处理增强:表单验证失败时保留用户输入和错误提示,session缺失时自动重定向到初始页面。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 21:17:04