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

  • Post category:Python

get_form_kwargs()函数是Django中定义在ModelFormMixin中的一个方法,它的作用是返回附加给表单的关键字参数,这些关键字参数可以在表单实例化的时候被用作参数。例如,一些视图需要在表单实例化时将某些附加的参数传递给表单。

以下是get_form_kwargs()函数的签名:

def get_form_kwargs(self):
    kwargs = super().get_form_kwargs()
    # 在这里添加额外的参数
    return kwargs

在这里,我们可以使用super()来调用父类的get_form_kwargs()方法,以确保我们不会覆盖模板的行为。然后,在该方法中,我们可以添加自己的代码来向表单添加额外的关键字参数。

下面是两个使用get_form_kwargs()的实例,以更好地理解它的特点。

  1. 为表单添加额外的关键字参数
# views.py

from django.views.generic.edit import CreateView, UpdateView
from .models import MyModel
from .forms import MyForm

class MyCreateView(CreateView):
    model = MyModel
    form_class = MyForm

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

# forms.py

from django import forms
from .models import MyModel

class MyForm(forms.ModelForm):
    class Meta:
        model = MyModel
        fields = ['field1', 'field2', 'field3']

    def __init__(self, *args, **kwargs):
        current_user = kwargs.pop('current_user', None)
        super().__init__(*args, **kwargs)
        if current_user:
            self.fields['field1'].queryset = self.fields['field1'].queryset.filter(user=current_user)

在上面的代码中,我们向一个名为MyCreateView的视图添加了一个自定义的get_form_kwargs()方法,它将当前用户作为一个额外的关键字参数传递给MyForm。在MyForm中重写__init__()方法,我们取出这个关键字参数,并根据它来动态设置field1字段的queryset,以过滤到与当前用户无关的对象。

在上面的例子中,我们演示了如何将一个自定义参数传递给表单MyForm,同时也演示了在表单中使用该参数的方法。

  1. 使用get_form_kwargs()创建动态表单集
# views.py

from django.views.generic.list import ListView
from .models import MyModel
from .forms import MyForm

class MyListView(ListView):
    model = MyModel

    def get_form_kwargs(self):
        kwargs = super().get_form_kwargs()
        kwargs['parent_id'] = self.kwargs.get('parent_id', None)
        return kwargs

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['formset'] = MyForm.formset(**self.get_form_kwargs())
        return context

# forms.py

from django import forms
from .models import MyModel

class MyForm(forms.ModelForm):
    class Meta:
        model = MyModel
        fields = ['field1', 'field2', 'field3']

    @classmethod
    def formset(cls, parent_id=None, **kwargs):
        formset = inlineformset_factory(
            MyParentModel, MyModel, form=cls, extra=1)
        if parent_id:
            queryset = MyModel.objects.filter(parent_id=parent_id)
            formset.queryset = queryset
        return formset(**kwargs)

在上面的代码中,我们定义了一个名为MyListView的视图,它使用自定义的get_form_kwargs()方法来创建一个关键字参数,将它传递给表单,用于根据父对象过滤子对象并创建formset。在get_context_data()方法中,我们使用MyForm.formset()来动态创建表单,将创建的formset添加到上下文中,并将其在模板中渲染出来。在这个例子中,我们演示了如何使用get_form_kwargs()方法动态地创建表单。它们可以用于根据不同的用户中的需要创建不同的表单。

这是关于get_form_kwargs()函数的完整攻略和实例,希望对你有帮助。