Django:使用模板中的按钮删除查询过滤器

Posted

技术标签:

【中文标题】Django:使用模板中的按钮删除查询过滤器【英文标题】:Django: Deleting query filters with button in template 【发布时间】:2018-07-03 10:53:46 【问题描述】:

我有一个列表视图,它显示顶部有一个简单过滤器的对象列表(“扬声器”)。

在模板中我放了以下代码

      <form class="col-md-5" method="get">
            <div class="input-group">

                <select name="type" class="selectpicker" multiple>
                    % for type in types %
                    <option><a href="#"> type.name </a></option>
                    % endfor %
                </select>    

            <span class="input-group-btn"><button class="btn btn-gray" type="submit">Search</button></span>
            </div>
        </form>

类型由列表视图中的“get_context_data”方法提供,就像这样

def get_context_data(self, **kwargs):
    data = super(SpeakerList, self).get_context_data(**kwargs)
    typelist = [x for x in Type.objects.all()]
    data['types'] = typelist
    return data

过滤器是 'get_queryset' 方法中的句柄,就像这样

def get_queryset(self, **kwargs):
        qs = super(SpeakerList,self).get_queryset().filter(status=STATE_ACTIVE)
        types = self.request.GET.getlist('type', None)
        categories = self.request.GET.getlist('category', None)

        if types:
            qs = qs.filter(type__in=types)
        if categories:
            qs = categories.filter(categories__in=categories)

        return qs

到目前为止,一切都很好。但是,我想在模板中显示所有选定的过滤器,它们后面有一个“删除”按钮,以便用户可以删除特定的过滤器。 然后模板看起来像这样

[类型选择下拉菜单]。

[ 日间发言人 'X'] 。 [周末演讲者'X']

对象列表

提供使用的过滤器很容易,我在 get_context_data 中添加了以下代码

types_query = self.request.GET.getlist('type', None)
data['types_query']

并在我的模板中使用了以下代码:

% if types_query %
    <p>You used the following 'type' filters:</p>

    % for type in types_query %
        <p> type  <button>Remove</button> </p>
    % endfor %
% endif %

但是,我不确定如何从这里开始。该列表按应有的方式呈现,但我不知道如何制作 'remove filter' 。功能性工作。

如果我将上面的代码包含在一个表单中并发布,它将清除整个查询集。但是,如果我不这样做,表单将无法访问当前选择的过滤器。

我在很多网站上都看到过这样的功能,所以我知道应该可以。这里有人知道我做错了什么吗?

【问题讨论】:

【参考方案1】:

使用 href 锚定已删除该查询参数的同一页面。

% for type in types_query %
    <p> type  <a href=" url_with_type_removed ">Remove</a> </p>
% endfor % 

您需要在视图中进行一些处理才能得出 URL 的外观。 This 回答可以帮到你。

【讨论】:

以上是关于Django:使用模板中的按钮删除查询过滤器的主要内容,如果未能解决你的问题,请参考以下文章

在 django 中访问传递给模板的过滤器查询结果

模板中的 Django 动态对象过滤问题

Django 模板过滤器查询集

大 O 表示法:在 Django 模板中使用多个 forloops VS 在 vi​​ews.py 中使用过滤器的多个查询

使用过滤器 Django/python 查询数据

Django 过滤和查询:在views.py、模板或过滤器中进行?