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

  • Post category:Python

get_form_class()函数是Django模型视图中的一个方法,主要用于为模型视图动态指定一个表单类。通常情况下,如果未手动指定表单类,则模型视图将自动为当前模型类生成一个默认的表单类。然而,在某些情况下,我们可能需要根据特定需求自定义一个表单类,而get_form_class()方法便是为我们提供了这样的功能。

get_form_class()方法的使用方法如下:

class MyModelView(View):

    def get_form_class(self):
        # 手动指定表单类
        return MyCustomForm

当上述代码被执行时,MyModelView视图便将采用我们手动指定的MyCustomForm表单类。需要注意的是,get_form_class()方法必须返回一个表单类。

下面给出两个实际的例子,以进一步解释get_form_class()方法的作用。

示例一:为视图指定自定义表单类

假设我们有一个Person模型,它有一个name字段和一个email字段。我们要创建一个与Person模型相关的视图,允许用户编辑个人信息,但不允许用户直接修改email字段。因此,我们需要为这个视图指定一个自定义表单类,仅包含name字段。

from django import forms
from django.views import generic
from myapp.models import Person

class PersonForm(forms.ModelForm):
    class Meta:
        model = Person
        fields = ['name']

class PersonUpdateView(generic.UpdateView):
    model = Person
    form_class = PersonForm

    def get_form_class(self):
        return PersonForm

上述代码中,我们创建了一个PersonForm表单类,只包含了name字段。在PersonUpdateView视图中,我们手动指定了表单类为PersonForm,然后在get_form_class()方法中再次指定表单类为PersonForm。

示例二:为不同请求类型指定不同的表单类

在某些情况下,我们需要针对不同的请求类型(如GET和POST)使用不同的表单类。考虑下面的例子,我们要针对GET请求返回一个用于查询数据的表单类,而对于POST请求,我们则使用另一个表单类用于提交数据。

from django import forms
from django.views import generic
from myapp.forms import QueryForm, EntryForm

class EntryUpdateView(generic.UpdateView):
    model = Entry

    def get_form_class(self):
        if self.request.method == 'GET':
            return QueryForm
        elif self.request.method == 'POST':
            return EntryForm

在上述代码中,我们创建了两个表单类:QueryForm和EntryForm。在EntryUpdateView视图中,我们根据请求类型动态地指定使用哪个表单类。当请求为GET时,我们使用QueryForm,而在POST时则使用EntryForm。

通过get_form_class()方法,我们可以实现对于不同情况使用不同的表单类,拓展Django视图的灵活性。