ListView已被get_context_data()和get_queryset()(django-filter)覆盖,但不会显示更新的ListView

时间:2019-04-12 22:36:29

标签: django django-forms django-views django-filter

我的用户需要动态过滤,以缩短默认情况下ListView中生成的数据的完整列表。

我已经从Django how to get multiple context_object_name for multiple queryset from single view to single template

引用了使用django-filter的代码示例。

https://simpleisbetterthancomplex.com/tutorial/2016/11/28/how-to-filter-querysets-dynamically.html

https://kuttler.eu/en/post/using-django-tables2-filters-crispy-forms-together/

我尝试为ListView自定义 def get_context_data() def get_queryset()

目前,GET表单已正确显示在HTML模板中,带有供用户过滤数据的字段。但是,提交(单击按钮)后,列表视图不会过滤,它将继续显示原始的完整数据列表。

尽管该列表在基于函数的视图和单独的HTML文件中使用django-filter成功更新,但我强烈希望保留在ListView中,因为此页面已链接到其他视图(创建,删除和更新)和ListView需要分页功能。

我最初的猜测是ListView可能不接受用户的GET请求进行动态过滤,因为它总是自动呈现所有数据?

谢谢您的建议。

filters.py-DataIntervalFilter

class DataIntervalFilter(django_filters.FilterSet):
    class Meta:
        model = Data_Collection_Interval
        fields = ['staffrowid', 'datacollectstart',]

views.py-ListView

class DatesListView(StaffRequiredMixin, ListView):
    model = Data_Collection_Interval
    template_name = 'Administrator/manDates.html'
    context_object_name = 'intervals'
    ordering = ['datacollectstart','datacollectdeadline','staffrowid']
    paginate_by = 10

    def get_queryset(self, **kwargs):
        return Data_Collection_Interval.objects.all()

    def get_context_data(self, **kwargs):
        context = super(DatesListView, self).get_context_data(**kwargs)
        interval_filter = DataIntervalFilter(self.request.GET, queryset=self.get_queryset(**kwargs))
        context['filter'] = interval_filter
        return context

模板-manDates.html(使用清晰的表单)

        <div>
          <form method="get">
            {% crispy filter.form %}
            <button type="submit">Search</button>
          </form>
        </div>
        <div>
          <ul>
          {% for interval in filter.qs %}
            <li class="list-group-item list-group-item-light"> <a href="{% url 'dates-detail' interval.datacollectid %}">{{ interval.datacollectstart }} - {{ interval.staffrowid }}</li>
          {% endfor %}
          </ul>
        </div>

0 个答案:

没有答案