def searchView(request, page): if request.method == 'GET': searchs = Dynamic.objects.select_related('video').order_by('-search').all()[:6] kword = request.session.get('kword', '') if kword: videos = Video.objects.filter(Q(name__icontains=kword) | Q(author=kword)).order_by('-release').all() else: videos = Video.objects.order_by('-release').all()[:50] paginator = Paginator(videos, 5) try: pages = paginator.page(page) except PageNotAnInteger: pages = paginator.page(1) except EmptyPage: pages = paginator.page(paginator.num_pages) if kword: idList = Video.objects.filter(name__icontains=kword) for i in idList: dynamics = Dynamic.objects.filter(video_id=i.id) if dynamics: dynamics.update(search=F('search') + 1) else: dynamic = Dynamic(plays=0, search=1, download=0, video_id=i.id) dynamic.save() return render(request, 'search.html', locals()) else: request.session['kword'] = request.POST.get('kword', '') return redirect(reverse('search', kwargs={'page': 1}))
时间: 2024-04-27 14:21:36 浏览: 14
这是一个函数视图,用于处理搜索页面的请求。它接收两个参数:request 和 page。其中,request 包含了请求相关的信息,如请求方式、请求头、请求参数等;page 是用于分页的页码。
函数首先判断请求方式是否为 GET,如果是,则从数据库中获取热门搜索记录,并根据用户输入的关键词过滤视频列表。如果用户没有输入关键词,则默认显示最新发布的前50个视频。然后,使用 Django 自带的分页功能将视频列表分页,并将当前页的视频列表传递给前端页面。
如果用户输入了关键词,在用户搜索完成后,程序会更新数据库中视频的搜索次数。具体地,首先根据关键词搜索视频列表,然后遍历列表中的每个视频,查找该视频对应的动态记录,如果存在,则将搜索次数加1;否则,创建一条新的动态记录,并将搜索次数初始化为1。
如果请求方式不是 GET,说明用户提交了搜索表单,程序会将用户输入的关键词存储到 session 中,并重定向到页码为1的搜索页面。
相关问题
from django.shortcuts import render, redirect from django.core.paginator import Paginator from django.core.paginator import EmptyPage from django.core.paginator import PageNotAnInteger from django.shortcuts import reverse from django.db.models import Q, F from index.models import * def searchView(request, page): if request.method == 'GET': searchs = Dynamic.objects.select_related('video').order_by('-search').all()[:6] kword = request.session.get('kword', '') if kword: videos = Video.objects.filter(Q(name__icontains=kword) | Q(author=kword)).order_by('-release').all() else: videos = Video.objects.order_by('-release').all()[:50] paginator = Paginator(videos, 5) try: pages = paginator.page(page) except PageNotAnInteger: pages = paginator.page(1) except EmptyPage: pages = paginator.page(paginator.num_pages) if kword: idList = Video.objects.filter(name__icontains=kword) for i in idList: dynamics = Dynamic.objects.filter(video_id=i.id) if dynamics: dynamics.update(search=F('search') + 1) else: dynamic = Dynamic(plays=0, search=1, download=0, video_id=i.id) dynamic.save() return render(request, 'search.html', locals()) else: request.session['kword'] = request.POST.get('kword', '') return redirect(reverse('search', kwargs={'page': 1}))
这段代码是一个 Django 视图函数,用于处理用户的搜索请求。它的作用是:
1. 如果是 GET 请求,从数据库中获取最热门的 6 个视频,并根据用户输入的关键词搜索相关视频。如果没有关键词,则返回最新的 50 个视频。
2. 将搜索结果分页,并根据用户请求的页码返回对应的页面。如果页码不是整数,则返回第一页;如果页码超出范围,则返回最后一页。
3. 如果有关键词,则根据关键词更新相应视频的搜索次数。
4. 最后将搜索结果渲染到模板 search.html 中,并返回给用户。如果是 POST 请求,则将用户输入的关键词保存在会话中,并重定向到第一页搜索结果。
async function InProcessCount() { const list = await store.dispatch('ESourcingModule/GetMyRequest', searchView.value) // eslint-disable-next-line @typescript-eslint/no-unsafe-call event.InProcessCount = list.filter((o: { ViewType: string }) => o.ViewType === 'InClarification' || o.ViewType === 'SupplementEventDetails').length } function CheckAdmin(routeritem: RouteRecordRaw) { document.title = 'RMS E-Sourcing' let temp = event.UsersInfo if (routeritem !== undefined && routeritem.meta !== undefined && routeritem.meta?.title !== undefined && routeritem.meta?.title === 'My Request') { // eslint-disable-next-line @typescript-eslint/restrict-plus-operands routeritem.meta.title = routeritem.meta?.title + '(' + event.InProcessCount + ')' } const routeRoles = routeritem.meta?.roles as string[] !== undefined ? routeritem.meta?.roles as string[] : [] if (temp === undefined) { return false } for (let i = 0; i < temp.ROLES.length; i++) { if (routeRoles.indexOf(temp.ROLES[i]) > -1 && routeritem.meta?.isSub !== 'true') { // 路由包含当前用户权限,直接返回 return true } } return false } 优化代码
你的代码可以做一些优化,这样可以提高代码的可读性和性能。这里提供一份优化后的代码:
```
async function getInProcessCount() {
const list = await store.dispatch('ESourcingModule/GetMyRequest', searchView.value)
return list.filter((o: { ViewType: string }) => o.ViewType === 'InClarification' || o.ViewType === 'SupplementEventDetails').length
}
function checkAdmin(routeritem: RouteRecordRaw) {
document.title = 'RMS E-Sourcing'
// 获取 InProcessCount 数据
let inProcessCount = 0
if (routeritem?.meta?.title === 'My Request') {
getInProcessCount().then(count => inProcessCount = count)
}
// 检查用户权限
const userRoles = event.UsersInfo?.ROLES
const routeRoles = routeritem?.meta?.roles || []
if (!userRoles) {
return false
}
return userRoles.some(role => routeRoles.includes(role) && routeritem?.meta?.isSub !== 'true')
}
// 用法示例
const routerItem = { meta: { title: 'My Request', roles: ['admin'], isSub: false } }
checkAdmin(routerItem).then(isAdmin => {
if (isAdmin) {
routerItem.meta.title = `${routerItem.meta.title} (${inProcessCount})`
}
})
```
这里的优化主要有以下几点:
1. 把获取 InProcessCount 数据的操作封装成了一个独立的函数 `getInProcessCount()`,方便代码复用和维护。
2. 使用 Promise 和 async/await 异步获取数据,避免了数据无法同步的问题。
3. 使用了可选链运算符 `?.` 和空值合并运算符 `||`,简化了代码判断逻辑,提高了代码的可读性。
4. 在检查用户权限时,使用了 `Array.prototype.some()` 方法和 `Array.prototype.includes()` 方法,简化了代码逻辑,提高了性能。
另外,建议你在代码中使用一致的命名风格,比如使用小驼峰式命名方法名和变量名,使用大驼峰式命名类型名和类名,这样可以提高代码的可读性。