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

时间:2018-01-24 11:44:54

标签: django django-templates

我有一个列表视图,显示一个顶部有一个简单过滤器的对象列表('Speakers')。

在模板中我输入了以下代码

      <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>

这些类型由listview中的'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

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

[输入选择下拉列表]。

[Day-speaker'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 %}

但是,我不知道如何从这里开始。列表按原样呈现,但我不知道如何制作'删除过滤器'。功能工作。

如果我将上面的代码放在一个表单中并将其发布,它将清除整个查询集。然而,如果我没有表格,则无法访问当前选定的过滤器。

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

1 个答案:

答案 0 :(得分:1)

使用href删除同一页面并删除该查询参数。

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

您需要在视图中进行一些处理才能得出URL应该是什么样子。 This回答可以帮助你。