Django ViewList

本文介绍了Django的通用视图ListView,详细讲解了其基本用法,包括如何设置model、template_name和paginate_by属性。此外,还展示了如何在ListView中添加条件查询,通过kwargs接收URL参数以实现动态查询条件,帮助开发者更高效地创建带分页的列表页面。

通用视图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}}">&laquo; first</a>
				<a href="?page={{ page_obj.previous_page_number }}+{{query}}">previous</a>
			{% else %}
				<a href="?page=1">&laquo; 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 &raquo;</a>
			{% else %}
				<a href="?page={{ page_obj.next_page_number }}">next</a>
				<a href="?page={{ page_obj.paginator.num_pages }}">last &raquo;</a>
			{% endif %}
			
		{% endif %}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值