详解Django的 get_form() 函数:获取视图所使用的表单实例

  • Post category:Python

Django中的get_form()函数是一个用于动态生成表单的方法,它一般会被使用在视图中,用来生成一个表单以供用户填写。get_form()函数可以让开发者通过一些参数,手动地添加一些表单字段,或者对已有的表单进行修改。

get_form()函数的基本用法

get_form()函数是定义在另一个方法之内的,这意味着当编写表单的视图函数时,需要首先定义一个类来表示表单。下面是一个示例代码:

from django import forms
from django.views.generic import FormView

class MyForm(forms.Form):
    username = forms.CharField()

class MyFormView(FormView):
    form_class = MyForm

    def get_form(self, **kwargs):
        form = super().get_form(**kwargs)
        # 动态为表单添加一个email字段
        form.fields["email"] = forms.EmailField()
        return form

在这个代码中,我们定义了一个表单类 MyForm,它的其中一个字段是 username。在 MyFormView 类中,定义了 get_form() 方法。在这个方法中,我们首先调用了父类的 get_form() 方法,这样我们就能够创建 MyForm 的一个实例。

接着,我们添加了一个新的 email 字段。这个新字段是通过 forms.EmailField() 创建的一个 EmailField 实例。在表单渲染时,这个字段就会展示在表单的底部。

在视图中使用该表单时,只需要将 MyFormView 类传递给路由即可。

get_form()函数的高级用法

相对于基本用法,get_form()函数更加灵活,我们可以通过各种方式来动态地控制表单的生成行为,下面提供两个实例:

实例1:控制表单字段参数的生成

from django import forms
from django.views.generic import FormView

class MyForm(forms.Form):
    username = forms.CharField()

class MyFormView(FormView):
    form_class = MyForm

    def get_form(self, **kwargs):
        form = super().get_form(**kwargs)
        # 更改username字段的label
        form.fields["username"].label = "用户名"
        # 更改username字段的widget属性
        form.fields["username"].widget.attrs["class"] = "form-control"
        return form

在此示例中,我们动态地对表单的字段进行了调整。通过更改 label 属性,我们将 username 字段的名称由默认的 Username 修改为 用户名。然后我们又通过更改 widget 属性,将 username 字段附加上了一个叫做 form-control 的 CSS 类,以调整这个表单字段的外观样式。在实际使用中,这些属性是非常实用的,能够允许我们实时地调整表单的元素,以满足页面的需求。

实例2:创建一个只读的表单

from django import forms
from django.views.generic import FormView

class MyForm(forms.Form):
    username = forms.CharField()
    email = forms.EmailField()

class MyFormView(FormView):
    form_class = MyForm

    def form_valid(self, form):
        return render(self.request, "my_template.html", {"form": form})

    def get_form(self, **kwargs):
        form = super().get_form(**kwargs)
        # 将username和email字段整体设置为只读
        form.fields["username"].widget.attrs["readonly"] = True
        form.fields["email"].widget.attrs["readonly"] = True
        return form

在这个示例中,我们首先定义了一个表单,该表单包含了两个字段:usernameemail。我们希望将这些字段变为只读,以避免用户对这些数据进行修改。因此,我们在 get_form() 方法中,为这两个字段动态地添加了一个属性:readonly = True

form_valid() 方法中,我们将这个只读表单传递给一个模板页面,以供用户查看。在这个页面中,这个表单会变成只读的,即使用户试图进行修改,也无效。