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



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

我有一个基于类的视图:

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"]))

夸尔格似乎不是在这种背景下定义的。

我还发现,在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'),

您必须在__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)

最新更新