Django:基于调用视图的pk的forms.ModelChoiceField

时间:2015-02-19 20:10:41

标签: python django django-forms django-views

我正在寻找一种通过调用视图的forms.ModelChoiceField()过滤pk内容的方法。

我有一个基于类的视图:

class StorageItemMergeView(FormView):
    form_class = MergeStorageItemsForm
    #.... 

使用MergeStorageItemsForm,目前定义为:

class MergeStorageItemsForm(forms.Form):
    storageitem1 = forms.ModelChoiceField(queryset=StorageItem.objects.get(pk=self.kwargs["pk"]))

StorageItemMergeView连接到一个对象,所以我只想提供也连接的对象。我试图将kwargs放在几个变体形式的定义中,例如。

storageitem1 = forms.ModelChoiceField(queryset=StorageItem.objects.get(pk=self.kwargs["pk"]))
似乎没有在这种情况下定义kwargs。

我发现,发现可以在modelForm上重新定义__init__()以获得类似的内容

def __init__(self, user=None, **kwargs):
    super(MergeStorageItemsForm, self).__init__(**kwargs)
    #... 

这没有做到这一点。如何根据请求和/或对象来调用表单提供的选项?

我对应的urls.py部分看起来像那样

url(r'^storageitem/(?P<pk>[\w]+)/merge/$', login_required(
        StorageItemMergeView.as_view()), name='storage_item_merge'),

1 个答案:

答案 0 :(得分:1)

您必须在__init__方法中执行此操作,如下所示:

class MergeStorageItemsForm(forms.Form):
    storageitem1 = forms.ModelChoiceField(queryset=StorageItem.objects.none())

    def __init__(self, *args, **kwargs):
        self.storage_pk = kwargs.pop('pk')
        super(MergeStorageItemsForm, self).__init__(*args, **kwargs)
        self.fileds['storageitem1'].queryset = StorageItem.objects.get(pk=self.storage_pk)