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
在这个示例中,我们首先定义了一个表单,该表单包含了两个字段:username
和 email
。我们希望将这些字段变为只读,以避免用户对这些数据进行修改。因此,我们在 get_form()
方法中,为这两个字段动态地添加了一个属性:readonly = True
。
在 form_valid()
方法中,我们将这个只读表单传递给一个模板页面,以供用户查看。在这个页面中,这个表单会变成只读的,即使用户试图进行修改,也无效。