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

  • Post category:Python

get_form_kwargs()函数是Django中form视图函数的一个方法,用于获取form的传递参数。在Django中定义FormView或CreateView等视图时,我们会定义一个form_class属性至少一个model_form_class父类。

实例1:

class CustomFormView(FormView):
    template_name = "form.html"
    form_class = CustomForm
    success_url = reverse("success_view")

    def form_valid(self, form):
        form.save()
        return super().form_valid(form)

    def get_form_kwargs(self):
        kwargs = super().get_form_kwargs()
        # 做一些自己的操作
        return kwargs

在上面这个例子中,get_form_kwargs()函数会返回一个字典,用于传递参数到CustomForm中。当View.dispatch()方法被调用并执行它们的完成时,kwargs将由CustomForm类中的__init__()方法获取。kwargs中的值由InitialValuePOST,GET以及其他类似QueryDict的字典对象填充。

例如,我们可以在kwargs中加入一个变量’user’,如下所示:

class CustomFormView(FormView):
    template_name = "form.html"
    form_class = CustomForm
    success_url = reverse("success_view")

    def form_valid(self, form):
        form.save()
        return super().form_valid(form)

    def get_form_kwargs(self):
        kwargs = super().get_form_kwargs()
        kwargs['user'] = self.request.user
        return kwargs

在form.py中我们通过以下方式访问user:

class CustomForm(forms.Form):
    name = forms.CharField()

    def __init__(self, *args, **kwargs):
        self.user = kwargs.pop('user')
        super().__init__(*args, **kwargs)

当Django框架在实例化form时,会调用__init__()函数,我们通过pop()函数取出’username’的值并存储在self.user变量中。

实例2:

class CustomCreateView(CreateView):
    template_name = "create.html"
    form_class = CustomForm
    success_url = reverse("success_view")

    def get_form_kwargs(self):
        kwargs = super().get_form_kwargs()
        if self.request.GET and 'initial' in self.request.GET:
            try:
                initial = json.loads(self.request.GET.get('initial'))
                kwargs['initial'] = initial
            except:
                pass
        return kwargs

在上面的例子中,get_form_kwargs()函数会解析通过查询字符串传递的initial变量值。如果获取到了initial变量值,我们会将其设置到form实例中的initial这个属性。这个变量被用于传递给form的初始数据。

需要注意的是:在使用get_form_kwargs()方法时,必须在重写方法的时候调用父类型的方法。这样才能保证在用户定义的数据下面,不丢失原始的kwargs。

总结:
get_form_kwargs()方法可以让你在在创建form时,添加一些自定义的参数。通常情况下,这些参数可以从视图请求对象,查询字符串等中提取。这是一个非常实用的方法,可以帮助我们在创建form的时候,使用一些请求相关的初始值。