书籍下载
创建相应的书籍app
创建相应的数书籍的数据库
from django.db import models
# Create your models here.
#创建book的数据库
from utils.news_comment.BaseModel import Base
class Doc(Base):
"""create doc view
"""
file_url = models.URLField(verbose_name="文件url", help_text="文件url")
title = models.CharField(max_length=150, verbose_name="文档标题", help_text="文档标题")
desc = models.TextField(verbose_name="文档描述", help_text="文档描述")
image_url = models.URLField(default="", verbose_name="图片url", help_text="图片url")
author = models.ForeignKey('user.Users', on_delete=models.SET_NULL, null=True)
class Meta:
db_table = "tb_docs" # 指明数据库表名
verbose_name = "用户" # 在admin站点中显示的名称
verbose_name_plural = verbose_name # 显示的复数名称
def __str__(self):
return self.title
创建视图函数,来显示书籍
def docs(request):
docs=Doc.objects.only('image_url','desc','title').filter(delete_is=False);
return render(request,'doc/docDownload.html',context={'docs':docs})// 向前端的html返回书籍信息
编写书籍前端的代码
{#<!DOCTYPE html>#}
{#<html>#}
{#<head>#}
{# <meta charset="utf-8">#}
{# <title>payInfo</title>#}
{# <link rel="stylesheet" href="../../static/css/base/reset.css">#}
{# <link rel="stylesheet" href="../../static/css/base/common.css">#}
{# <link rel="stylesheet" href="../../static/css/doc/docDownload.css">#}
{# <link rel="stylesheet" href="../../static/css/base/side.css">#}
{# <link rel="stylesheet" href="http://at.alicdn.com/t/font_684044_un7umbuwwfp.css">#}
{#</head>#}
{#<body>#}
{#<!-- header start -->#}
{#<header id="header">#}
{# <div class="mw1200 header-contain clearfix">#}
{# <!-- logo start -->#}
{# <h1 class="logo">#}
{# <a href="javascript:void(0);" class="logo-title">Python</a>#}
{# </h1>#}
{# <!-- logo end -->#}
{# <!-- nav start -->#}
{# <nav class="nav">#}
{# <ul class="menu">#}
{# <li><a href="../news/index.html">首页</a></li>#}
{# <li><a href="../course/course.html">在线课堂</a></li>#}
{# <li><a href="docDownload.html">下载文档</a></li>#}
{# <li><a href="../news/search.html">搜索</a></li>#}
{# </ul>#}
{# </nav>#}
{# <!-- nav end -->#}
{# <!-- login start -->#}
{# <div class="login-box">#}
{# <div>#}
{# <i class="PyWhich py-user"></i>#}
{# <span>#}
{# <a href="javascript:void(0);" class="login">登录</a> / <a href="../users/register.html"#}
{# class="reg">注册</a>#}
{# </span>#}
{# </div>#}
{# <div class="author hide">#}
{# <i class="PyWhich py-user"></i>#}
{# <span>qwertyui</span>#}
{# <ul class="author-menu">#}
{# <li><a href="javascript:void(0);">后台管理</a></li>#}
{# <li><a href="javascript:void(0);">退出登录</a></li>#}
{# </ul>#}
{# </div>#}
{# </div>#}
{# <!-- login end -->#}
{# </div>#}
{#</header>#}
{#<!-- header end -->#}
{##}
{##}
{#<!-- main start -->#}
{#<main id="main">#}
{# <div class="w1200 clearfix">#}
{# <!-- main-contain start -->#}
{# <div class="main-contain ">#}
{# <div class="banner">#}
{# <img src="https://ss0.bdstatic.com/70cFuHSh_Q1YnxGkpoWK1HF6hhy/it/u=1802845035,3786939119&fm=26&gp=0.jpg"#}
{# alt="">#}
{# </div>#}
{# <div class="pay-doc-contain">#}
{# <ul class="pay-list">#}
{##}
{# <li class="pay-item">#}
{# <div class="pay-img doc"></div>#}
{# <div class="d-contain">#}
{# <p class="doc-title">python cookbook 3.0 教程</p>#}
{# <p class="doc-desc">强烈推荐的python 教程。</p>#}
{##}
{# <!-- /www/?xxx -->#}
{# <a href="#" class="pay-price">下载</a>#}
{# </div>#}
{# </li>#}
{##}
{# <li class="pay-item">#}
{# <div class="pay-img doc"></div>#}
{# <div class="pay-contain">#}
{# <p class="pay-title">流畅的Python</p>#}
{# <p class="pay-desc">【本书特色】#}
{##}
{# 本书由奋战在Python开发一线近20年的Luciano Ramalho执笔,Victor Stinner、Alex#}
{# Martelli等Python大咖担纲技术审稿人,从语言设计层面剖析编程细节,兼顾Python 3和Python#}
{# 2,告诉你Python中不亲自动手实践就无法理解的语言陷阱成因和解决之道,教你写出风格地道的Python代码。</p>#}
{##}
{# <!-- /www/?xxx -->#}
{# <a href="#" class="pay-price">下载</a>#}
{# </div>#}
{# </li>#}
{##}
{# <li class="pay-item">#}
{# <div class="pay-img doc"></div>#}
{# <div class="pay-contain">#}
{# <p class="pay-title">深入Flask</p>#}
{# <p class="pay-desc">深入Flask,强烈推荐!</p>#}
{##}
{# <!-- /www/?xxx -->#}
{# <a href="#" class="pay-price">下载</a>#}
{# </div>#}
{# </li>#}
{##}
{# </ul>#}
{# </div>#}
{# </div>#}
{# <!-- main-contain end -->#}
{# <!-- side start -->#}
{# <aside class="side">#}
{# <div class="side-activities">#}
{# <h3 class="activities-title">在线课堂<a href="javascript:void(0)">更多</a></h3>#}
{# <div class="activities-img">#}
{# <a href="javascript:void(0);" target="_blank">#}
{# <img src="https://res.shiguangkey.com//file/201804/26/20180426142628123364782.jpg" alt="title">#}
{# </a>#}
{# <p class="activities-tips">对话国外小姐姐</p>#}
{# </div>#}
{# <ul class="activities-list">#}
{# <li>#}
{# <a href="javascript:void(0);" target="_blank">#}
{# <span class="active-status active-start">报名中</span>#}
{# <span class="active-title"><a href="https://www.shiguangkey.com/course/2432"> Django 项目班</a></span>#}
{# </a>#}
{# </li>#}
{# <li>#}
{# <a href="javascript:void(0);" target="_blank">#}
{# <span class="active-status active-end">已结束</span>#}
{# <span class="active-title"><a href="https://www.shiguangkey.com/course/2321">Python入门基础班</a></span>#}
{# </a>#}
{# </li>#}
{# </ul>#}
{# </div>#}
{# <div class="side-attention clearfix">#}
{# <h3 class="attention-title">关注我</h3>#}
{# <ul class="side-attention-address">#}
{# <li>#}
{# <a href="javascript:void(0);" target="_blank"><i class="PyWhich py-GitHub"></i>Taka</a>#}
{# </li>#}
{# <li>#}
{# <a href="javascript:void(0);" target="_blank"><i class="PyWhich py-zhihu"#}
{# style="color:rgb(0, 108, 226);"></i>Taka</a>#}
{# </li>#}
{# <li>#}
{# <a href="javascript:void(0);" target="_blank"><i class="PyWhich py-weibo"#}
{# style="color:rgb(245,92,110);"></i>Taka</a>#}
{# </li>#}
{# </ul>#}
{# <div class="side-attention-qr">#}
{# <p>扫码关注</p>#}
{# </div>#}
{# </div>#}
{##}
{##}
{##}
{# </aside>#}
{# <!-- side end -->#}
{##}
{##}
{# </div>#}
{#</main>#}
{##}
{##}
{#<!-- main end -->#}
{##}
{#<!-- footer start -->#}
{#<footer id="footer">#}
{# <div class="footer-box">#}
{# <div class="footer-content">#}
{# <p class="top-content">#}
{# <span class="link">#}
{# <a href="javascript:void(0)">关于Python</a> |#}
{# <a href="javascript:void(0)">我就是我</a> |#}
{# <a href="javascript:void(0)">人生苦短</a> |#}
{# <a href="javascript:void(0)">我用Python</a>#}
{# </span>#}
{# <span class="about-me">关于我: <i class="PyWhich py-wechat"></i> Taka</span>#}
{# </p>#}
{# <p class="bottom-content">#}
{# <span>地址: xxxx</span>#}
{# <span>联系方式: <a href="tel:400-1567-315">400-1567-315</a> (24小时在线)</span>#}
{# </p>#}
{# </div>#}
{# <p class="copyright-desc">#}
{# Copyright © 2008 - 2019 xxx有限公司. All Rights Reserved#}
{# </p>#}
{# </div>#}
{#</footer>#}
{#<!-- footer end -->#}
{#<script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.js"></script>#}
{#<script src="../../static/js/commons.js"></script>#}
{#</body>#}
{#</html>#}
{% extends 'base/base.html' %}
{% block title %} 文档下载 {% endblock %}
{% block link %}
<link rel="stylesheet" href="../../static/css/doc/docDownload.css">
{% endblock %}
{% block main_contain %}
<div class="main-contain ">
<div class="banner">
<img src="https://ss0.bdstatic.com/70cFuHSh_Q1YnxGkpoWK1HF6hhy/it/u=1802845035,3786939119&fm=26&gp=0.jpg"
alt="">
</div>
<div class="pay-doc-contain">
<ul class="pay-list">
{% for doc in docs %}
<li class="pay-item">
<img src="{{ doc.image_url }}" alt=" " class="pay-img doc" />
<div class="d-contain">
<p class="doc-title">{{ doc.title }}</p>
<p class="doc-desc">{{ doc.desc }}</p>
<!-- /www/?xxx -->
//通过前端传值,向后台发送下载的书籍的编号
<a href="{% url 'download' doc.id %}" class="pay-price">下载</a>
</div>
</li>
{% endfor %}
</ul>
</div>
</div>
{% endblock %}
创建视图函数来下载对应的文档
//创建一个类视图类下载文档
class DocDownload(View):
//传递过来的id
def get(self,request,doc_id):
//查询对应id的第一条信息
doc_file = Doc.objects.only('file_url').filter(delete_is=False,id=doc_id).first()
if doc_file:
# /media/流畅的Python.pdf
//获得数据库中的url
doc_url = doc_file.file_url
# http://192.168.216.137:8000/media/流畅的Python.pdf
//在setting中写DOC_FILE_URL =“http://127.0.0.1:8000”,对书籍的地址进行拼接
doc_url = DOC_FILE_URL + doc_url
# a = requests.get(doc_url)
# res = HttpResponse(a)
//对相应的url进行数据请求
res = FileResponse(requests.get(doc_url))
//对路由进行切分获得书籍的格式
ex_name = doc_url.split('.')[-1] # pdf
if not ex_name:
raise Http404('文件名异常')
else:
ex_name = ex_name.lower()
if ex_name == 'pdf':
res['Content-type'] = 'application/pdf'
elif ex_name == 'doc':
res['Content-type'] = 'application/msowrd'
elif ex_name == 'ppt':
res['Content-type'] = 'application/powerpoint'
else:
raise Http404('文件格式不正确')
获取书籍的全称,并将其转码
doc_filename = escape_uri_path(doc_url.split('/')[-1])
将其保存
# attachment 保存 inline 显示
res["Content-Disposition"] = "attachment; filename*=UTF-8''{}".format(doc_filename)
return res
else:
raise Http404('文档不存在')
路由配置
# from django.contrib import admin
from django.urls import path,include,re_path
from django.views.static import serve
import pytest.settings
from . import views
urlpatterns = [
path('', views.docs, name='docs'),
path('download/<int:doc_id>/', views.DocDownload.as_view(), name='download'),
]
前端样式修改
```css
/* 在static/css/doc/docDownload.css中,把如下代码覆盖之前的样式 */
/* ================= main start ================= */
#main {
margin-top: 25px;
min-height: 700px;
flex: 1;
}
/* ========= main-contain start ============ */
#main .main-contain {
width: 800px;
float: left;
margin-bottom: 30px;
}
/* ========= banner start =========== */
.main-contain .banner {
width: 100%;
}
.main-contain .banner img {
max-width: 100%;
}
.main-contain .pay-doc-contain {
background: #fff;
}
.main-contain .pay-doc-contain .pay-list {
display: flex;
justify-content: space-between;
flex-flow: wrap;
padding: 0 20px 20px;
}
.main-contain .pay-doc-contain .pay-item {
width: 800px;
height: 200px;
border-top: 1px solid #ddd;
margin-top: 20px;
display: flex;
}
.main-contain .pay-doc-contain .pay-item:hover {
box-shadow: 2px 2px 2px #ccc;
}
.pay-doc-contain .pay-item .pay-img {
width: 120px;
margin-right: 30px;
}
.pay-doc-contain .pay-item .pay-contain {
width: 250px;
position: relative
}
.pay-item .pay-contain .pay-title {
font-size: 20px;
line-height: 40px;
white-space: nowrap;
overflow: hidden;
}
.pay-item .pay-contain .pay-desc {
line-height: 20px;
color: #878787;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-line-clamp: 3;
-webkit-box-orient: vertical;
font-size: 14px;
overflow: hidden;
}
.pay-item .pay-price {
display: block;
font-size: 20px;
text-align: right;
padding-right: 20px;
color: coral;
}
.d-contain {
width: 100%;
margin: 20px 0 20px ;
font-size: 18px;
line-height: normal;
}
.d-contain .doc-desc {
text-indent: 2em;
margin: 15px;
/*padding: 10px;*/
}
.d-contain .doc-title {
font-size: 20px;
font-weight: bold;
color: chocolate;
}
/* ========= banner end =========== */
/* ========= main-contain end ============ */
/* ================= main end ================= */
通过编写可以通过前端页面显示出来