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

  • Post category:Python

get_form_class() 函数是 Django 中的一个方法,用于使用于该视图的表单类动态生成表单类。 在视图生成表单时需要从模型生成表单,或使用视图之外的一些参数动态生成表单时特别有用。

下面是 get_form_class() 方法的详细讲解:

作用

在类视图中动态生成表单类,可以用来生成单独的表单,还可以依赖视图的其他属性动态生成表单。

使用方法

要使用 get_form_class() 方法,需要首先在类视图中定义一个 form_class 属性,该属性用来存储生成表单类的类(form_class = MyForm)。

然后,可以将 get_form_class() 方法添加到类视图中,并将其作为生成表单类的入口点。

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

class MyCreateView(CreateView):
    model = MyModel
    form_class = MyForm

    def get_form_class(self):
        if self.request.user.is_superuser:
            return MyFormSuperuser
        else:
            return MyForm

以上代码中, get_form_class() 方法依赖于请求的 user 属性。 如果用户是超级用户,则生成一个新的表单类 MyFormSuperuser,否则生成默认的 MyForm 表单。

在实例中,当请求来自超级用户时,使用 MyFormSuperuser 类动态生成表单,否则使用默认的 MyForm 类。 这是一个非常有用的技术,特别是在一个视图中包含多个表单类的情况下。

实例说明

下面提供两个 get_form_class() 方法的实例说明。

示例1:基于 URL 参数动态生成表单

可以使用 URL 参数来动态控制表单类,并动态生成表单。 在这个例子中,我们将支持两种参数 — form_type1form_type2 — 并根据参数生成表单。

from django.views.generic import CreateView
from .models import MyModel
from .forms import MyForm, MyFormType1, MyFormType2

class MyCreateView(CreateView):
    model = MyModel

    def get_form_class(self):
        form_type = self.request.GET.get('form_type', 'default')
        if form_type == 'form_type1':
            return MyFormType1
        elif form_type == 'form_type2':
            return MyFormType2
        else:
            return MyForm

在这里,我们首先从 GET 参数中获取 form_type 的值,然后判断值并相应生成表单类。 如果参数没有提供或者值无效,则生成默认的 MyForm 表单类。

示例2:基于视图属性动态生成表单

下面一个实例,尤其适用于根据视图的其他属相而动态调整表单。

from django.views.generic import CreateView
from .models import MyModel
from .forms import MyForm, MyFormReadOnly

class MyCreateView(CreateView):
    model = MyModel    
    form_class = MyForm

    def get_form_class(self):
        if self.request.method == 'POST':
            return MyForm
        elif self.object.allow_edit:
            return MyForm
        else:
            return MyFormReadOnly

在这个示例中,如果提交是 POST 或者是允许修改,则使用 MyForm 表单类创建表单,否则使用 MyFormReadOnly 类创建只读类表单。

小结

以上就是关于 Django 中 get_form_class() 方法的详细讲解和使用方法。这种技术可以使更好的管理表单,尤其是对视图的操作影响表单动态调整时,尤其有用。