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

  • Post category:Python

get_form_class() 函数是 Django 中全局的一个函数,用于获取视图中使用的表单类。它根据请求中的内容自动选择表单类,并返回该表单类。

get_form_class() 函数的声明如下:

def get_form_class(self):
    """
    Return the form class to use.

    Defaults to using self.form_class.
    """
    return self.form_class

get_form_class() 函数中包含一个属性 form_class,该属性用于指定模型实例使用的表单类。通常情况下,Django 将会优先使用该属性的值来返回表单类。

当使用 get_form_class() 方法时,有以下两种用法:

1. 使用默认的表单类

默认情况下(即未指定 form_class 属性),get_form_class() 方法将返回视图函数中定义的表单类。当然,这需要在视图函数中指定相应的表单类。示例如下:

from django import forms
from django.views.generic.edit import CreateView

class UserForm(forms.Form):
    name = forms.CharField(max_length=100)
    email = forms.EmailField(max_length=150)

class CreateUserView(CreateView):
    model = User
    fields = ['name', 'email']
    template_name = 'create_user.html'

    def form_valid(self, form):
        # Process valid form data
        return super(CreateUserView, self).form_valid(form)

    def form_invalid(self, form):
        # Process invalid form data
        return super(CreateUserView, self).form_invalid(form)

    def get_form_class(self):
        return UserForm

上面的例子定义了一个表单类 UserForm,并将其绑定至 CreateUserView 视图中。通过重载 get_form_class() 函数可以在行动时强制 Django 使用该表单类。

2. 自定义所需的表单类

通过实现自己的 get_form_class() 函数,您可以控制使用哪个表单类。此策略最常用于在运行时动态选择表单类。示例代码如下:

from django import forms
from django.views.generic.edit import CreateView

class UserForm(forms.Form):
    name = forms.CharField(max_length=100)
    email = forms.EmailField(max_length=150)

class UserForm2(forms.Form):
    username = forms.CharField(max_length=100)
    password = forms.CharField(max_length=100)

class CreateUserView(CreateView):
    model = User
    fields = ['name', 'email']
    template_name = 'create_user.html'

    def form_valid(self, form):
        # Process valid form data
        return super(CreateUserView, self).form_valid(form)

    def form_invalid(self, form):
        # Process invalid form data
        return super(CreateUserView, self).form_invalid(form)

    def get_form_class(self):
        # Select form based on some condition
        if condition:
            return UserForm
        else:
            return UserForm2

在上述代码中,根据某种条件 condition 返回不同的表单类,可以实现动态选择表单类的目的。

此外,您还可以使用 **kwargs 参数来传递额外的参数。在上面的例子中,假设有一个条件为 condition,你想将这个条件传递给列表视图,就可使用以下代码:

def get_form_class(self, **kwargs):
    if self.condition:
        return UserForm
    else:
        return UserForm2

通过这种方式,调用者可以使用以下方式向视图提供条件:

CreateUserView.as_view(condition=True)