Sir*_*rah 13 python django listview views
希望这应该是一个简单的帮助我.
我有一个包含下拉菜单的页面,其中包含三个项目:
<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>
Run Code Online (Sandbox Code Playgroud)
当用户选择一个项目并点击提交时,它们会在通用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
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试使用分页控件转换页面时,查询集将重置为第一个(默认)项目Cats,因为(我认为)表单数据已重置.
知道如何规避这个问题吗?
谢谢!
PS:哦,就此而言,是否可以将查询集设置为无开始?非常感谢!
更新:当我在Cats查询集上使用分页时它工作正常,所以bug只显示在其他两个集合上.
Sir*_*rah 13
为了解决这个问题,我刚刚修改了分页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>
Run Code Online (Sandbox Code Playgroud)
这里的{{input}}是一个字符串,其中包含通过表单提交的选项,例如'Cats'或'Worms'.
为了能够将其传递给模板,我修改了基于类的视图的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
Run Code Online (Sandbox Code Playgroud)
就是这样,url字符串现在读取如下内容:
/browse/?browse=Cats&page=3
Run Code Online (Sandbox Code Playgroud)
所以就是这样,分页现在与表单的get方法一起工作.
| 归档时间: |
|
| 查看次数: |
19810 次 |
| 最近记录: |