我想在表单类中传递
self.request
数据。我可以在 View 中访问它,但无法在 form 类中访问它。
class AttendanceCreateView(LoginRequiredMixin, CreateView):
model = Attendance
template_name = 'attendance/attendances_new.html'
form_class = AttendanceForm
def get_initial(self):
initial = super().get_initial()
initial['class_name'] = self.request.GET.get('class', '')
return initial
我的表格课程:
class AttendanceForm(forms.ModelForm):
class_name = forms.ChoiceField(choices=CLASS_NAMES, disabled=True)
teacher = forms.ModelMultipleChoiceField(
queryset=Teacher.objects.all().order_by('id'))
subject_name = forms.ChoiceField(choices=[])
total_students = forms.IntegerField(initial=0)
unique_code = forms.IntegerField(initial=0)
class Meta:
model = Attendance
fields = ['class_name', 'teacher', 'subject_name',
'total_students', 'unique_code']
def __init__(self, *args, **kwargs):
super(AttendanceForm, self).__init__(*args, **kwargs)
# This I need to be done
# if self.request.GET.get('class', '') = 'class1':
# self.fields['subject_name'].choices = MY_CHOICES_1
# elif self.request.GET.get('class', '') = 'class2':
# self.fields['subject_name'].choices = MY_CHOICES_2
我想根据传递的请求值设置
subject_name
选择。对于第 1 类,我想要不同的主题选择。对于第 2 类,我想要不同的主题选择等。因此获取请求数据很重要。
有没有办法像我对
class_name
那样在直接视图中设置初始选择?或者有什么关于如何在形式上做到这一点的建议吗?
通过
form_kwargs
传递请求:
class AttendanceCreateView(LoginRequiredMixin, CreateView):
model = Attendance
template_name = 'attendance/attendances_new.html'
form_class = AttendanceForm
def get_form_kwargs(self):
kwargs = super().get_form_kwargs()
kwargs['request'] = self.request
return kwargs
def get_initial(self):
initial = super().get_initial()
initial['class_name'] = self.request.GET.get('class', '')
return initial
然后我们以以下形式处理:
class AttendanceForm(forms.ModelForm):
# …
def __init__(self, *args, request, **kwargs):
self.request = request
super().__init__(*args, **kwargs)
if self.request.GET.get('class', '') == 'class1':
self.fields['subject_name'].choices = MY_CHOICES_1
elif self.request.GET.get('class', '') == 'class2':
self.fields['subject_name'].choices = MY_CHOICES_2
注意:自 PEP-3135 [pep] 起,如果第一个参数是定义方法的类,第二个参数是方法,则无需带参数调用
函数的第一个参数(通常为super(…)
)。self