Django将自定义查询集添加到ListView中

问题描述 投票:1回答:1

我有一个listview,我以一种非常糟糕的标准方式访问,以返回所有元对象。

#url 
url(r'^metaobject/$', MetaObjectList.as_view(),name='metaobject_list'),

#ListView
class MetaObjectList(ListView):
    model = MetaObject

我最近添加了一个搜索表单,我想扫描我的对象(我有大约5个字段,但我简化了示例)。我想做的是重复使用我的MetaObjectList类视图和我的特定子集。我猜我需要覆盖get_queryset方法,但我不清楚我如何从我的FormView获取查询集到listview。我在formveiw的form_valid函数中使用其他参数调用as_view(),但无法使其工作,无论如何它看起来很hacky。

class SearchView(FormView):
    template_name = 'heavy/search.html'
    form_class = SearchForm

    #success_url = '/thanks/'

    def form_valid(self, form):
        #build a queryset based on form
        searchval=form.cleaned_data['search']
        list = MetaObject.objects.filter(val=search)
        #where to from here?

我还试着将表单视图中的数据发布到listview,但似乎我需要将表单逻辑重新编写到listview中。

我在python 3.x和django 1.11上。

python django python-3.x listview django-views
1个回答
1
投票

我发现我觉得比问题评论更优雅:

我的表单现在有效指向列表对象的as_view方法,并传递我想要的请求和查询集

def form_valid(self, form):
    #build a queryset based on form
    searchval=form.cleaned_data['search']
    list = MetaObject.objects.filter(val=search)
    return MetaObjectList.as_view()(self.request,list)

这会将ListView命中为我用来更改查询集的帖子

class MetaObjectList(ListView):
    model = MetaObject

    queryset = MetaObject.objects.prefetch_related('object_type','domain')

    def post(self, request, *args, **kwargs):
        self.queryset = args[0]
        return self.get(request, *args, **kwargs)

唯一明显的变化是使用kwargs让它更清晰一些。否则这似乎运作良好。

© www.soinside.com 2019 - 2024. All rights reserved.