首页 文章

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

提问于
浏览
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上 .

1 回答

  • 0

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

    我的表单现在有效指向列表对象的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让它更清晰一些 . 否则这似乎运作良好 .

相关问题