详解Django的 get_form_class() 函数:获取视图所使用的表单类

  • Post category:Python

get_form_class()函数是Django框架中的一个方法,用于获取当前视图所使用的表单类。该方法可以被重写以改变默认生成的表单类,或者根据具体的逻辑来选择不同的表单类。以下是详细的攻略。

作用

在Django中,表单类是由视图来定义和使用的,而get_form_class()方法就是决定使用哪个表单类的关键。

当视图类中使用了Django自带的CreateViewUpdateViewFormView等视图类时,系统会默认调用get_form_class()方法去获取当前视图所使用的表单类,然后在实例化视图类时传入该表单类。

因此,重写get_form_class()方法可以用于改变默认生成的表单类,或者根据具体的逻辑来选择不同的表单类。

使用方法

基本的使用方法是在视图类中重写get_form_class()方法,并通过返回一个表单类来指定所使用的表单类。例如:

from django import forms
from django.views.generic import CreateView
from .models import MyModel

class MyModelForm(forms.ModelForm):
    class Meta:
        model = MyModel
        fields = ('field1', 'field2',)

class MyModelCreateView(CreateView):
    model = MyModel
    form_class = MyModelForm

    def get_form_class(self):
        if some_condition:
            return AnotherForm
        else:
            return MyModelForm

在上面的例子中,我们定义了一个MyModelForm表单类,然后在MyModelCreateView视图类中将form_class属性设置为MyModelForm。接下来,我们重写了get_form_class()方法来动态决定使用哪个表单类。

实例说明

实例一:利用get_form_class()方法区分PC端和移动端用户

在某些情况下,我们需要为不同的用户类型提供不同的表单,这时就可以使用get_form_class()方法来进行区分。例如,我们可以使用以下的方式为PC端和移动端用户分别提供不同的表单:

from django import forms
from django.views.generic.create_update import CreateView
from myapp.models import MyModel

class PCMyModelForm(forms.ModelForm):
    class Meta:
        model = MyModel
        fields = ('field1', 'field2')

class MobileMyModelForm(forms.ModelForm):
    class Meta:
        model = MyModel
        fields = ('field1', 'field2')

class MyModelCreateView(CreateView):
    model = MyModel

    def get_form_class(self):
        if self.request.user_agent.is_mobile:
            return MobileMyModelForm
        else:
            return PCMyModelForm

在上面的例子中,我们定义了PCMyModelFormMobileMyModelForm两个表单类,然后在MyModelCreateView视图类中重写了get_form_class()方法。该方法使用request.user_agent.is_mobile属性来判断当前用户是否为移动端用户,然后根据判断结果返回相应的表单类。

实例二:利用get_form_class()方法根据用户权限动态生成表单

在有些情况下,我们需要根据用户的角色或权限动态生成表单,这时就可以使用get_form_class()方法进行处理。例如,在下面的例子中,我们定义了两个表单类FormAFormB,并分别为管理员和普通用户提供了不同的表单:

from django.shortcuts import render
from django.views.generic.edit import FormView
from myapp.forms import FormA, FormB

class MyFormView(FormView):
    template_name = 'my_template.html'

    def get(self, request, *args, **kwargs):
        if request.user.is_superuser:
            self.form_class = FormA
        else:
            self.form_class = FormB
        return super().get(request, *args, **kwargs)

在上面的例子中,我们定义了MyFormView视图类,并在实例化时将form_class属性默认设置为FormB表单类。然后在get()方法中判断当前用户是否为管理员,如果是则将form_class属性设置为FormA,否则不做任何操作。最后调用super().get()方法返回渲染好的表单。