我的用户需要动态过滤,以缩短默认情况下ListView中生成的数据的完整列表。
引用了使用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>