Djngo-书籍下载

书籍下载

创建相应的书籍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 &copy; 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 ================= */

通过编写可以通过前端页面显示出来

在这里插入图片描述
在这里插入图片描述

结束

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值