【发布时间】:2018-03-11 12:48:36
【问题描述】:
我正在尝试使用下拉表单根据用户过滤 ListView。
models.py
class Post(models.Model):
...
author = models.ForeignKey('auth.User', verbose_name="Post Author")
views.py
class PostList(ListView):
model = Post
context_object_name = 'posts'
def get_queryset(self):
result = super(PostList, self).get_queryset()
author_filter = self.request.GET.get('author')
if author_filter:
result = Post.objects.filter(Q(author__icontains=author_filter))
return result
post_list.html
<form action="" method="get">
<select name="author" onchange="this.form.submit();">
<option selected="selected" disabled>Select an author</option>
{% all_author as authors %}
{% for author in authors %}
<option value="{{ author }}">{{ author }}</option>
{% endfor %}
</select>
</form>
我正在使用自定义模板标签来呈现all_authors,这工作正常。选择作者时,在 urls 中我可以看到传递了一些东西 (/?author=xxx),但列表没有被过滤。
编辑
根据 andi 的建议,我使用 django 过滤器使其以这种方式工作。但是由于某种原因,filters.py 中的fields = ['field_name',] 没有被考虑在内,所以我在模板中单独选择字段。
views.py
class PostList(FilterView):
model = Post
filter_class = PostFilter
context_object_name = 'posts'
paginate_by = 50
template_name = 'directory/post_list.html'
filters.py
class PostFilter(django_filters.FilterSet):
class Meta:
model = Post
fields = ['author',]
post_list.html
<form action="" method="get">
{{ filter.form.author }}
<input type="submit" />
</form>
编辑 2
我发现为什么选择的字段没有正确传递,需要在视图中使用 filterset_class = 而不是 filter_class =
【问题讨论】: