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

Django表单仅展示同分支教师失败,报NameError错误求助

解决表单过滤同分支教师的NameError问题

问题原因

表单的__init__方法中直接使用request变量,但该变量并未被传入方法内,导致NameError。

解决方案

1. 修改forms.py,让表单接收request参数

class ClassesForm(forms.ModelForm):
    class Meta:
        model = Classes
        fields = [
            'sath',
            'code',
            'name',
            'gender',
            'teacher',
            'meeting',
            'holding',
            'teadadjalasat',
            'sen',
            'datestart',
            'miantermstart',
            'dateend',
            'description',
            'room',
        ]

    def __init__(self, *args, **kwargs):
        # 从参数中取出request,默认值为None
        self.request = kwargs.pop('request', None)
        super().__init__(*args, **kwargs)
        # 仅当request存在时过滤教师查询集
        if self.request:
            self.fields['teacher'].queryset = Profile.objects.filter(
                semat__icontains="teacher",
                status=1,
                branch=self.request.user.branch
            )

2. 修改views.py,在CreateView中传递request到表单

class classesCreate(ClassesInline, CreateView):
    form_class = ClassesForm  # 明确指定使用的表单类

    def get_form_kwargs(self):
        # 获取父类的表单参数
        kwargs = super().get_form_kwargs()
        # 将当前请求对象传入表单参数
        kwargs['request'] = self.request
        return kwargs

    def get_context_data(self, **kwargs):
        ctx = super(classesCreate, self).get_context_data(**kwargs)
        ctx['named_formsets'] = self.get_named_formsets()
        return ctx

    def get_named_formsets(self):
        if self.request.method == "GET":
            return {
                'reservs': ReservationFormSet(prefix='reservs'),
            }
        else:
            return {
                'reservs': ReservationFormSet(self.request.POST or None, self.request.FILES or None, prefix='reservs'),
            }

说明

  • 通过kwargs.pop('request', None)安全地从表单初始化参数中取出request,避免破坏父类的初始化逻辑
  • 在视图的get_form_kwargs方法中注入当前请求对象,确保表单能获取到用户信息
  • 增加request存在的判断,避免因request为None导致的额外错误

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 17:05:08