Django的get_form_kwargs()函数
Django的get_form_kwargs()函数可以用来自定义表单的关键字参数(keyword arguments)。表单的关键字参数能够通过构造函数传递给表单。通常情况下,表单从视图中获取一些上下文数据,然后将它们传递给表单的构造函数中,这些上下文数据可能包括:用户对象、queryset对象或其他的视图参数。get_form_kwargs()函数简化了这个过程,并可以被SubFormMixin、ModelFormMixin、CreateView等视图类调用。
使用方法
get_form_kwargs()函数接收任意数量的参数和关键字参数,但需要始终保持一个签名,接受一个request对象。该函数需要返回一个字典对象,这些对象可以用来初始化表单类。比如,可以将request对象以及从URL捕获的其他参数放入表单字典中。
class SampleFormView(FormView):
form_class = SampleForm
def get_form_kwargs(self):
kwargs = super().get_form_kwargs()
kwargs['user'] = self.request.user
kwargs['guests'] = self.request.session.get('guests')
return kwargs
在上面的例子中,表单视图从所继承的基类中获取默认的关键字参数,并在请求字典中添加了“user”和“guests”两个参数。
在下面的例子中,我们可以通过get_form_kwargs()来实现获取当前用户和相关数据的表单,并初始化用户提交的表单类:
class UserFormView(FormView):
form_class = UserForm
template_name = 'users/new_user_form.html'
def get_form_kwargs(self):
kwargs = super().get_form_kwargs()
kwargs['user'] = self.request.user
kwargs['data'] = self.request.POST or None
return kwargs
在上面这个例子中,get_form_kwargs()函数添加了一个“user”关键字参数,该参数表示当前用户。这里还使用了“data”关键字参数,用来传递请求中的表单数据(通过POST方法提交)。如果没有POST数据,就使用None来初始化表单。您可以在ModelForm、CreateView或UpdateView中添加DataMixin视图混合类来获取数据。
示例
我们拥有一个简单的Django ModelForm,这个ModelForm的目标是更新当前登录的用户信息。我们想要通过get_form_kwargs()方法来为表单添加一个 name 属性。
这里有一个实现过程:
from django.views.generic.edit import UpdateView
from django.contrib.auth.mixins import LoginRequiredMixin
from .models import User
from .forms import UserForm
class UpdateMyProfileView(LoginRequiredMixin, UpdateView):
model = User
form_class = UserForm
template_name = "user_form.html"
def get_form_kwargs(self):
kwargs = super().get_form_kwargs()
kwargs.update({"name": "New Form Name Here"})
return kwargs
我们使用了 Django Library 中的 UpdateView,model 和 form_class 用来指定模型和表单类。template_name 用于指定使用的模板文件。LoginRequiredMixin 是一个用于限制用户登录的 Mixin,它要求用户必须在视图中使用有效的登录凭证,并抛出 401 HTTP 异常以提示用户进行登录操作。
get_form_kwargs() 方法用来获取表单数据。在这个例子中,我们基于父类方法的返回值创建了一个新的字典对象并将其命名为 kwargs。我们之后重写了这个函数,并使用kwargs.update()函数为表单添加一个 name 参数。
get_form_kwargs() 方法的返回值应该是一个字典,这个字典中的数据应该用于初始化一个表单。
下面是示例模板 user_form.html:
{% extends 'base.html' %}
{% block content %}
<h1>Update My Profile</h1>
<form method="post" action="{% url 'update_my_profile' %}">
{% csrf_token %}
{{ form.as_p }}
<button type="submit" class="btn btn-primary">Save</button>
</form>
{% endblock %}
可以看到,在这个模板中我们使用了 form.as_p 将表单以 HTML 格式渲染出来。为了保证其可用性,还引入了一个 CSRF 的安全措施。在这个例子中,我们将会使用 kwargs['name'] 来作为表单的名称属性。
在这个例子中,用 get_form_kwargs() 方法添加了 「name」参数到表单中,并成功将其数据传到模板的 HTML 标签中。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解Django的 get_form_kwargs() 函数:获取表单的关键字参数 - Python技术站