如何以django形式传递self.request数据?

问题描述 投票:0回答:1

我想在表单类中传递

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
那样在直接视图中设置初始选择?或者有什么关于如何在形式上做到这一点的建议吗?

django django-views django-forms django-class-based-views django-request
1个回答
0
投票

通过

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
)。

© www.soinside.com 2019 - 2024. All rights reserved.