关键词

详解Django的 get_form_kwargs() 函数:获取表单的关键字参数

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 标签中。

本文链接:http://task.lmcjl.com/news/16176.html

展开阅读全文