使用get_queryset过滤CreateView中的模型

Bur*_*ich 4 django django-templates django-views

我正在尝试使用get_queryset()过滤模型,它似乎在视图中工作,但不在模板中.

我的看法 :

class FolderCreate(CreateView):
    fields = ['name', 'parent']
    template_name = 'Form/folder_create.html'

    def get_queryset(self):
        folders = Folder.objects.filter(owner=self.request.user) 
        print folders # ==> return [<Folder: Folder>, <Folder: Another folder>]
        return folders

    def form_valid(self, form):
        self.object = form.save(commit=False)
        self.object.owner = self.request.user
        return super(FolderCreate, self).form_valid(form)

    def get_initial(self):
        if self.request.method == 'GET':
            foldersUrl = self.request.META['HTTP_REFERER'].split('/')
            foldersUrl.pop()
            folder = urllib2.unquote(foldersUrl[-1])

            try:
                return {'parent' : Folder.objects.get(name=folder, owner=self.request.user)}
            except Folder.DoesNotExist:
                pass
Run Code Online (Sandbox Code Playgroud)

如您所见,文件夹在get_queryset()中返回与会话用户相关的两个对象:'Folder'和'Another folder

幸运的是,我的模板的组合框获取所有文件夹,没有任何过滤.

在此输入图像描述

任何的想法 ?

Dan*_*man 16

这里的问题get_queryset是没有在CreateView中使用,因为它用于过滤返回的模型以在列表或详细视图中显示.您想要完全不同的东西:您想要过滤表单字段中的可用选项.

为此,您需要创建一个接受userkwarg 的自定义ModelForm并相应地过滤查询集:

class FolderForm(forms.ModelForm):
    class Meta:
       model = Folder
       fields = ['name', 'parent']

    def __init__(self, *args, **kwargs):
       user = kwargs.pop('user')
       super(FolderForm, self).__init__(*args, **kwargs)
       self.fields['parent'].queryset = Folder.objects.filter(user=user)
Run Code Online (Sandbox Code Playgroud)

然后更改您的视图以使用该表单并传入user参数:

class FolderCreate(CreateView):
    template_name = 'Form/folder_create.html'
    form_class = FolderForm

    def get_form_kwargs(self):
        kwargs = super(FolderCreate, self).get_form_kwargs()
        kwargs['user'] = self.request.user
        return kwargs
Run Code Online (Sandbox Code Playgroud)