我正在寻找一种方法,通过调用视图的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)