我正在寻找一种通过调用 View 的pk
过滤forms.ModelChoiceField()
内容的方法。
我有一个基于类的 View :
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)
#...
这并没有达到目的。如何根据调用相应 View 的请求和/或对象来过滤表单提供的选项?
我的 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)
关于python - Django:基于调用 View 的 pk forms.ModelChoiceField,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28615972/