Django将自定义查询集放入ListView

Posted

技术标签:

【中文标题】Django将自定义查询集放入ListView【英文标题】:Django get custom queryset into ListView 【发布时间】:2018-02-28 22:11:58 【问题描述】:

我有一个列表视图,我以非常标准的方式访问它以返回所有元对象。

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

#ListView
class MetaObjectList(ListView):
    model = MetaObject

我最近添加了一个搜索表单,我想扫描我的对象(我有大约 5 个字段,但我已经简化了示例)。我想做的是将我的 MetaObjectList 类视图与我的特定子集一起使用。我猜我需要重写 get_queryset 方法,但我不清楚如何将查询集从我的 FormView 获取到列表视图中。我在 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?

我还考虑尝试将表单视图中的数据发布到列表视图,但这似乎需要将表单逻辑重新写入列表视图。

我使用的是 python 3.x 和 django 1.11。

【问题讨论】:

我想这会对你有所帮助***.com/questions/18664182/… 【参考方案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 使其更清晰。否则,这似乎运作良好。

【讨论】:

以上是关于Django将自定义查询集放入ListView的主要内容,如果未能解决你的问题,请参考以下文章

可用项目的 Django ListView 查询集

如何在 ListView 和 AlertDialog 中设置自定义字体?

Django 模板过滤器查询集

将自定义 ListView 项传递给 Android 中的其他活动

将自定义视图放入自定义 ScrollView

如何将自定义 tableView 搜索工具与 UISearchDisplayController 结合使用?