2017-01-07 9 views
0

У меня этот urls.pyКак фильтр для текущего объекта на FormView

... 
    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 может выглядеть локального хоста: 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

Вы можете добавить get_form_kwargs метод к вашему мнению:

def get_form_kwargs(self): 
    kwargs = super(ItemCreate, self).get_form_kwargs() 
    kwargs.update({ 
     'exclude_pk' : self.kwargs['pk'] 
    }) 
    return kwargs 

И фильтр QuerySet в вашем поле формы, как это:

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)