郑州 网站建设有限公司,阿里网站,网易网,甘肃省建设厅官方网站信息网1 歌曲搜索
音乐平台的每个网页顶部都设置了歌曲搜索功能#xff0c;歌曲搜索框以网页表单的形式展示#xff0c;并且以POST请求方式实现歌曲搜索功能#xff0c;搜索结果显示在歌曲搜索页。歌曲搜索页由项目应用search实现#xff0c;首先在search的urls.py中定义路由sea…1 歌曲搜索
音乐平台的每个网页顶部都设置了歌曲搜索功能歌曲搜索框以网页表单的形式展示并且以POST请求方式实现歌曲搜索功能搜索结果显示在歌曲搜索页。歌曲搜索页由项目应用search实现首先在search的urls.py中定义路由search。
1.1 路由定义
from django.urls import path
from .views import *
urlpatterns [path(int:page.html, searchView, namesearch),
]路由search设置了路由变量page该变量代表某一页的页数因为歌曲的搜索结果具有不确定性通过对搜索结果进行分页处理可以美化和规范网页内容。路由的HTTP请求由视图函数searchView负责接收和处理在search的views.py中定义视图函数searchView。
1.2 视图定义
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(song).order_by(-search).all()[:6]# 获取搜索内容如果kword为空就查询全部歌曲kword request.session.get(kword, )if kword:songs Song.objects.filter(Q(name__icontainskword) | Q(singerkword)).order_by(-release).all()else:songs Song.objects.order_by(-release).all()[:50]# 分页功能paginator Paginator(songs, 5)try:pages paginator.page(page)except PageNotAnInteger:pages paginator.page(1)except EmptyPage:pages paginator.page(paginator.num_pages)# 添加歌曲搜索次数if kword:idList Song.objects.filter(name__icontainskword)for i in idList:dynamics Dynamic.objects.filter(song_idi.id)# 判断歌曲动态信息是否存在若存在则在原来的基础上加1if dynamics:dynamics.update(searchF(search) 1)# 若动态信息不存在则创建新的动态信息else:dynamic Dynamic(plays0, search1, download0, song_idi.id)dynamic.save()return render(request, search.html, locals())else:# 处理POST请求并重定向搜索页面request.session[kword] request.POST.get(kword, )return redirect(reverse(search, kwargs{page: 1}))当视图函数searchView接收到路由search的POST请求后它将执行歌曲搜索过程执行过程说明如下
1当用户在歌曲搜索框输入搜索内容并单击“搜索”按钮后程序根据网页表单的属性action所指向的路由地址发送一个POST请求Django接收到请求后将请求信息交给视图函数searchView进行处理。
2如果视图函数searchView收到一个POST请求那么首先将请求参数kword写入会话Session进行存储请求参数kword是歌曲搜索框的搜索内容然后以重定向的方式访问歌曲搜索页。
3通过重定向访问歌曲搜索页等同于向歌曲搜索页发送一个GET请求视图函数searchView首先获取会话Session的数据判断Session是否存在kword。
4如果kword存在就以kword作为查询条件分别在模型Song的字段name和singer中进行模糊查询查询结果根据模型字段release进行降序排列如果kword不存在就查询模型Song的所有歌曲以模型字段release进行降序排列并且只获取前50首的歌曲信息。
5将查询结果进行分页处理以每5首歌为一页的方式进行分页。函数参数page代表某一页的页数它也代表路由变量page。
6根据搜索内容kword查找匹配的歌曲将符合匹配条件的歌曲进行遍历和判断如果歌曲的动态信息存在就对该歌曲的搜索次数累加1否则为歌曲新建一条动态信息并将搜索次数设为1。
7最后将变量searchs和分页对象pages传递给模板文件search.html由模板引擎进行解析并生成相应的网页内容。
1.3 模板定义
当模板文件search.html接收到变量searchs和分页对象pages后模板引擎对模板语法进行解析并转换成网页内容。变量searchs实现歌曲搜索框下方的热搜歌曲分页对象pages实现当前分页的歌曲列表歌分页导航功能。
{% extends base.html %}
{% load static %}
{% block link %}
link relshortcut icon href{% static favicon.ico %}
link relstylesheet href{% static css/common.css %}
link relstylesheet href{% static css/search.css %}
{% endblock %}{% block body %}
bodydiv classheadera href/ classlogoimg src{% static image/logo.png %}/adiv classsearch-boxform idsearchForm action{% url search 1 %} methodpost{% csrf_token %}div classsearch-keywordinput idkword namekword typetext classkeyword maxlength120//divinput idsubSerch typesubmit classsearch-button value搜 索 //formdiv idsuggest classsearch-suggest/divdiv classsearch-hot-words{% for s in searchs %}a targetplay href{% url play s.song.id %} {{ s.song.name }}/a{% endfor %}/div/div/div!--end header--div classnav-boxdiv classnav-box-innerul classnav clearfixlia href{% url index %}首页/a/lilia href{% url ranking %} target_blank歌曲排行/a/lilia href{% url home 1 %} target_blank用户中心/a/li/ul/div/div!--end nav-box--!--wrapper--div classwrapper clearfix idwrapperdiv classmod_songlistul classsonglist__headerli classsonglist__header_name歌曲/lili classsonglist__header_author歌手/lili classsonglist__header_time时长/li/ulul classsonglist__list{% for p in pages.object_list %}li classjs_songlist__childdiv classsonglist__itemdiv classsonglist__songnamespan classsonglist__songname_txta href{% url play p.id %} classjs_song targetplay{{ p.name }}/a/span/divdiv classsonglist__artista hrefjavascript:; classsinger_name {{ p.singer }}/a/divdiv classsonglist__time{{ p.time }}/div/div/li{% endfor %}/uldiv classpage-boxdiv classpagebar idpageBar{% if pages.has_previous %}a href{% url search pages.previous_page_number %} classprev target_selfi/i上一页/a{% endif %}{% for p in pages.paginator.page_range %}{% if pages.number p %}span classsel{{ p }}/span{% else %}a href{% url search p %} target_self{{ p }}/a{% endif %}{% endfor %}{% if pages.has_next %}a href{% url search pages.next_page_number %} classnext target_self下一页i/i/a{% endif %}/div/div/div/div
/body
{% endblock %}