Django ListView - 用于过滤和排序的表单 [英] Django ListView - Form to filter and sort
问题描述
我的目标
- 一个在表格中列出我所有更新(模型)的网站
- 不要一次显示所有模型(分页 - 每页可能 10 个)
- 过滤和排序列表
我的想法
- 我可以使用 ListView 来获取一组我所有的更新
- 使用 paginate_by = 10
- 使用表单在我的 QuerySet 中设置 order_by 或过滤器
我的问题
我不知道如何添加一个表单来使用过滤器和排序来修改我的 QuerySet.我的想法是使用额外的过滤器和 order_by 修改 get_queryset 中的查询.
I am not sure how to add an form to modify my QuerySet with filter and sortings. My Idea was to modify the Query in get_queryset with additional filter and order_by.
我的观点
class MyView(ListView):
model = Update
template_name = "updates/update.html"
paginate_by = 10
def get_queryset(self):
return Update.objects.filter(
~Q(state=Update.STATE_REJECTED),
~Q(state=Update.STATE_CANCELED),
~Q(state=Update.STATE_FINISHED),
).order_by(
'planned_release_date'
)
我的想法
类似的东西.我知道它不是这样工作的......只是为了说明
Something like this. I know it's not working like this ... just to illustrate
class MyView(ListView):
model = Update
template_name = "updates/update.html"
paginate_by = 10
def post(self, request, *args, **kwargs):
new_context = Update.objects.filter(
request.POST.get("filter"),
).order_by(
request.POST.get("sorting"),
)
def get_queryset(self):
return Update.objects.filter(
~Q(state=Update.STATE_REJECTED),
~Q(state=Update.STATE_CANCELED),
~Q(state=Update.STATE_FINISHED),
).order_by(
'planned_release_date'
)
推荐答案
你不需要发帖.在 url 中传递过滤器值和 order_by 例如:
You don't need post. Pass the filter value and order_by in the url for example:
.../update/list/?filter=filter-val&orderby=order-val
并在 get_queryset 中获取过滤器和 orderby,例如:
and get the filter and orderby in the get_queryset like:
class MyView(ListView):
model = Update
template_name = "updates/update.html"
paginate_by = 10
def get_queryset(self):
filter_val = self.request.GET.get('filter', 'give-default-value')
order = self.request.GET.get('orderby', 'give-default-value')
new_context = Update.objects.filter(
state=filter_val,
).order_by(order)
return new_context
def get_context_data(self, **kwargs):
context = super(MyView, self).get_context_data(**kwargs)
context['filter'] = self.request.GET.get('filter', 'give-default-value')
context['orderby'] = self.request.GET.get('orderby', 'give-default-value')
return context
确保为过滤和排序提供适当的默认值
Make sure you give proper default value to filter and orderby
示例表单(您可以根据需要进行修改):
Example form (you can modify this to your need):
<form method="get" action="{% url 'update-list' %}">
<p>Filter: <input type="text" value={{filter}} name="filter"/></p>
<p>order_by: <input type="text" value={{orderby}} name="orderby"/></p>
<p><input type="submit" name="submit" value="submit"/></p>
</form>
这篇关于Django ListView - 用于过滤和排序的表单的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!