使用get_queryset在CreateView中过滤模型 [英] Filtering a model in a CreateView with get_queryset

查看:117
本文介绍了使用get_queryset在CreateView中过滤模型的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用get_queryset()过滤模型,它似乎可以在视图中使用,但不能在模板中使用。



我的视图:

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

def get_queryset(self):
文件夹= Folder.objects.filter(owner = self.request.user)
打印文件夹#==> return [<文件夹:文件夹> ;,<文件夹:另一个文件夹>]
返回文件夹

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':
folderUrl = self.request.META ['HTTP_REFERER']。split('/')
folderUrl.pop()
文件夹= urllib2.unquote(foldersUrl [-1])$ ​​b
$ b尝试:
return {'parent':Folder.objects.get(name = folder,owner = self.request。用户)}
除Folder.DoesNotExist:
通过

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



不幸的是,模板的组合框获得了所有文件夹,而没有任何过滤



有什么想法吗?

解决方案

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



为此,您需要创建一个接受<$ c的自定义ModelForm。 $ c> user kwarg并相应地过滤查询集:

  class FolderForm(forms.ModelForm): 
类元:
模型=文件夹
字段= ['name','parent']

def __init __(self,* args,** kwargs):
user = kwargs.pop('user')
super(FolderForm,self).__ init __(* args,** kwargs)
self.fields ['parent']。queryset =文件夹.objects.filter(user = 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


I'm trying to filter a model with get_queryset() and it seems to work in the view but not in the template.

My view :

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

As you can see, folders return two objects related to the session user in get_queryset() : 'Folder' and 'Another folder

Infortunately, the combobox of my template get all the folders, without any filtering.

Any idea ?

解决方案

The issue here is that get_queryset is not used in a CreateView, as it's meant for filtering the models returned for display in a list or detail view. You want something completely different: you want to filter the choices available in a form field.

To do that you will need to create a custom ModelForm that accepts a user kwarg and filters the queryset accordingly:

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)

and then change your view to use that form and pass in the user parameter:

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

这篇关于使用get_queryset在CreateView中过滤模型的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆