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

