我有这个urls.py
...
url(r'^storageitem/(?P<pk>[\w]+)/merge/$', login_required(
StorageItemMergeView.as_view()), name='storage_item_merge'),
...
使用此view.py
...
class StorageItemMergeView(FormView):
form_class = MergeStorageItemsForm
success_url = reverse_lazy('storage_item_list')
template_name = 'pmgmt/storageitem/merge.html'
...
由于URL可能看起来像localhost:8000 / storageitem / 155 / merge /我想从表单中排除155。我试图定义一个自定义查询集
queryset = StorageItem.objects.exclude(pk=kwargs["pk"])
但是kwargs似乎并不存在。
...
queryset = StorageItem.objects.exclude(pk=kwargs["pk"])
NameError: name 'kwargs' is not defined
基于包含当前项目旁边所有项目的模型创建FormView的正确方法是什么?
答案 0 :(得分:0)
您可以在视图中添加get_form_kwargs方法:
def get_form_kwargs(self):
kwargs = super(ItemCreate, self).get_form_kwargs()
kwargs.update({
'exclude_pk' : self.kwargs['pk']
})
return kwargs
并在表单字段中过滤查询集,如下所示:
class MergeStorageItemsForm(Form):
# Form fields
def __init__(self, *args, **kwargs):
exclude_pk = kwargs.pop('exclude_pk')
super(FooForm, self).__init__(*args, **kwargs)
if exclude_id:
self.fields['some_field'].queryset = self.fields['some_field'].queryset.exclude(pk=exclude_pk)