5-Django项目--分页与搜索(资产页面)
from django.shortcuts import render
from django.http import HttpResponseRedirect
from .models import Asset
from django.urls import reverse
from django.views.generic import ListView
from django.db.models import Q
# 分页和搜索的ListView
class AssetListView(ListView):
model = Asset
template_name = 'assets/asset_list.html'
context_object_name = 'assets'
paginate_by = 10 # 每页10个项目
ordering = 'id' # 根据ID排序
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
query = self.request.GET.get('q')
if query:
# 使用Q对象进行搜索
context['assets'] = Asset.objects.filter(
Q(hostname__icontains=query) |
Q(ip__icontains=query) |
Q(model__icontains=query) |
Q(sn__icontains=query)
)
return context
def get_queryset(self):
# 重写get_queryset以支持搜索
queryset = super().get_queryset()
return queryset.order_by('id')
def get_success_url(self):
# 重写get_success_url以支持搜索后的重定向
if self.request.GET.get('q'):
return reverse('assets:asset-list') + '?q=' + self.request.GET.get('q')
return reverse('assets:asset-list')
这段代码使用了Django的ListView来实现分页和搜索功能。ListView自动处理分页,我们通过重写get\_context\_data和get\_queryset方法来增加搜索功能。搜索使用了Django的Q对象来构建复杂的查询,并且在搜索后重定向回资产列表页面时保留搜索词。
评论已关闭