【问题标题】:How to filter for current object on FormView如何在 FormView 上过滤当前对象
【发布时间】:2017-01-07 14:37:14
【问题描述】:

我有这个 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 的正确方法,其中所有项目都在当前项目之外?

【问题讨论】:

    标签: python django formview


    【解决方案1】:

    您可以将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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-09
      • 2015-11-21
      • 1970-01-01
      • 2021-06-16
      • 2021-11-20
      • 2022-01-08
      相关资源
      最近更新 更多