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