gpt4 book ai didi

python - Django ListView自定义查询集

转载 作者:太空狗 更新时间:2023-10-29 17:44:48 24 4
gpt4 key购买 nike

希望这应该是一个简单的帮助我的问题。

我有一个包含三个项目的下拉菜单的页面:

<form method="GET">

<select name="browse">

<option>Cats</option>

<option>Dogs</option>

<option>Worms</option>

</select>

<input type="submit" value="Submit" />

</form>

<!-- Output table -->

<table id="myTable">

<thead>
<tr>
<th>Name</th>
<th>Colour</th>
</tr>
</thead>

<tbody>
{% for object in object_list %}
<tr>
<td>{{ object.name }}</td>
<td>{{ object.colour }}</td>
</tr>
{% endfor %}
</tbody>

</table>

<!-- Pagination controls -->

<div class="pagination">
<span class="page-links">
{% if page_obj.has_previous %}
<a href="?page={{ page_obj.previous_page_number }}">previous</a>
{% endif %}
<span class="page-current">
Page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }}.
</span>
{% if page_obj.has_next %}
<a href="?page={{ page_obj.next_page_number }}">next</a>
{% endif %}
</span>
</div>

当用户选择一个项目并点击提交时,他们将在由通用 ListView 生成的表格中获得结果:

class Browse(generic.ListView):
template_name = 'app/browse.html'
paginate_by = 25

def get_queryset(self):
queryset = Cats.objects.all()
if self.request.GET.get("browse"):
selection = self.request.GET.get("browse")
if selection == "Cats":
queryset = Cats.objects.all()
elif selection == "Dogs":
queryset = Dogs.objects.all()
elif selection == "Worms":
queryset = Worms.objects.all()
else:
queryset = Cats.objects.all()
return queryset

但是,当我尝试使用分页控件翻页时,查询集重置为第一个(默认)项 Cats,因为(我认为)表单数据已重置。

知道如何规避这个问题吗?

谢谢!

PS:哦,就此而言,是否可以一开始就将查询集设置为无?非常感谢!

更新:当我在 Cats 查询集上使用分页时,它工作正常,因此错误仅显示在其他两个集上。

最佳答案

为了解决这个问题,我刚刚修改了分页 HTML,以适应来自表单的 get 请求和 url 字符串中的页码,如下所示:

<div class="pagination">
<span class="page-links">
{% if page_obj.has_previous %}
<a href="/browse/?browse={{ input }}&page={{ page_obj.previous_page_number }}">previous</a>
{% endif %}
<span class="page-current">
Page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }}.
</span>
{% if page_obj.has_next %}
<a href="/browse/?browse={{ input }}&page={{ page_obj.next_page_number }}">next</a>
{% endif %}
</span>
</div>

这里的 {{ input }} 是一个字符串,包含通过表单提交的选项,例如“猫”或“蠕虫”。

为了能够将其传递到模板中,我修改了基于类的 View 的 get_context_data 方法:

class Browse(generic.ListView):
template_name = 'app/browse.html'
paginate_by = 25

# Modifying the get_context_data method

def get_context_data(self, **kwargs):
context = super(Browse, self).get_context_data(**kwargs)
q = self.request.GET.get("browse")
context['input'] = q
return context

def get_queryset(self):
queryset = Cats.objects.all()
if self.request.GET.get("browse"):
selection = self.request.GET.get("browse")
if selection == "Cats":
queryset = Cats.objects.all()
elif selection == "Dogs":
queryset = Dogs.objects.all()
elif selection == "Worms":
queryset = Worms.objects.all()
else:
queryset = Cats.objects.all()
return queryset

就是这样,url 字符串现在看起来像这样:

/browse/?browse=Cats&page=3

就是这样,分页现在与表单的 get 方法一起工作。

关于python - Django ListView自定义查询集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22902457/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com