如何在FormView上筛选当前对象

时间:2017-01-07 14:37:14

标签: python django formview

我有这个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的正确方法是什么?

1 个答案:

答案 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)