Pyhont Django
通用视图ListView
Django 提供了一组基于类的通用视图,包含了开发中大部分的通用功能,ListView就是解决列表的问题,简洁,快速
基本用法ListView
使用ListView 首先需要在文件的顶部加载ListView
from django.views.generic import ListView
在app的views.py文件中写一个属于自己的ListView
from django.views.generic import ListView
from app.models import RegRecord
class RegRecordListView(ListView):
model = RegRecord
template_name = "app/index.html"
paginate_by=20
简单介绍一下ListView的属性
model ListView 会根据model所指向的类型来创建列表,model=RegRecord,ListView会调用RegRecord.objects.all()
template_name 如果这个参数不设置,那么ViewList会默认使用regrecord_list.html,否则会根据template_name的值使用哪个页面展示列表。
paginate_by 如果这个参数不设置,ViewList返回的列表是没有翻页的,如果这个参数被设置了,例如上面的例子,每页显示20条数据
ViewList还会在上下文环境中提供几个用于翻页使用的参数paginator 提供页数num_pages,总数据数count和一个页数的迭代器page_range,以上都是paginator的方法,可以在页面中通过{{paginator.num_pages}},{{paginator.count}},{{paginator.page_range}}使用
在app的urls.py里配置刚才编写的基于类的view。
from django.urls import path
from views import RegRecordListView
urlpatterns = [
path('',RegRecordListView.as_view(),name='index'),
]
<table>
<thead>
<th>111</th>
<th>111</th>
<th>111</th>
<th>111</th>
</thead>
<tbody>
{% for record in object_list %}
<tr>
<td>{{record.name}}</td>
<td>{{record.p_id}}</td>
<td>{{record.phone}}</td>
<td>{{record.address}}</td>
</tr>
{% endfor %}
</tbody>
</table>
{% for record in object_list %}
{% endfor %}
还需要一个展示列表的page
经过上面的简单配置,一个带有列表的page已经写完了。
带有条件的ViewList
大部分情况我们还会使用一些条件对结果进行筛选或查询,ViewList也会非常简单的实现,根据上面的例子继续完善带有条件的查询结果分页
from django.views.generic import ListView
from app.models import RegRecord
class RegRecordListView(ListView):
model = RegRecord
template_name = "app/index.html"
paginate_by=20
def get_queryset(self):
records = RegRecord.objects.all()
name = self.kwargs['name']
return records.filter(name__contains=name)
from django.urls import path
from views import RegRecordListView
urlpatterns = [
path('app/<name>/',RegRecordListView.as_view(),name='index'),
]
经过上面的配置,在请求的url里面加一个name参数,传到viewlist中之后通过调用kwargs可以读取这个参数的值注意:只有在url中配置了参数名称,才可以通过kwargs的方式读取参数的值,如果在url中没有配置参数,需要使用self.request.GET.get(‘name’)获取参数的值,这个会在后面的动态查询条件中使用
动态查询条件
from django.views.generic import ListView
from app.models import RegRecord
class RegRecordListView(ListView):
model = RegRecord
template_name = "app/index.html"
paginate_by=20
#可用的查询项,可以在这些选项中任选多个项目匹配条件查询
condition = {'name','phone','p_id','edifice','company','room','is_hubei','is_out','addressForback','p_type'}
def get_queryset(self):
records = RegRecord.objects.all()
#因为是动态查询的选项,无法在url中配置固定,所以参数无法通过kwargs获取,参数会存储在request.GET里
#request.GET是一个字典,遍历这个字典,判断用哪些项进行查询
for key,value in self.request.GET.items():
#如果查询项目存在于condition中并且有参数
if (key in self.condition) and value:
#根据提供的查询项筛选数据
if key == 'name':
records = records.filter(name__value)
elif key == 'p_id':
records = records.filter(p_id__value)
return records.filter(name__contains=name)
def get_context_data(self,*args,**kwargs):
context = super().get_context_data()
#把查询条件传递给页面,用于分页的时候还能保持条件的查询结果
for key,value in self.request.GET.items():
if (key in self.condition) and value:
context.get('query','') += '&' + key + '=' + value
return context
{% if page_obj.has_previous %}
{% if query %}
<a href="?page=1+{{query}}">« first</a>
<a href="?page={{ page_obj.previous_page_number }}+{{query}}">previous</a>
{% else %}
<a href="?page=1">« first</a>
<a href="?page={{ page_obj.previous_page_number }}">previous</a>
{% endif %}
{% endif %}
<span class="current">
Page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }}.
</span>
{% if page_obj.has_next %}
{% if query %}
<a href="?page={{ page_obj.next_page_number }}+{{query}}">next</a>
<a href="?page={{ page_obj.paginator.num_pages }}+{{query}}">last »</a>
{% else %}
<a href="?page={{ page_obj.next_page_number }}">next</a>
<a href="?page={{ page_obj.paginator.num_pages }}">last »</a>
{% endif %}
{% endif %}
本文介绍了Django的通用视图ListView,详细讲解了其基本用法,包括如何设置model、template_name和paginate_by属性。此外,还展示了如何在ListView中添加条件查询,通过kwargs接收URL参数以实现动态查询条件,帮助开发者更高效地创建带分页的列表页面。

119

被折叠的 条评论
为什么被折叠?



