Django(10)|一个简单的博客系统(模板继承+分页器+模型中的媒体文件media+富文本编辑器)

一、创建工程和配置过程

1.创建项目

在命令行输入

python mange.py startproject myblog

2.配置-打开项目

  1. 创建一个views文件
  2. urls.py 中导入views
  3. 创建templates 和static 目录
  4. 将静态文件和templates设置
    在这里插入图片描述
    在这里插入图片描述

二、导入前端模板

  1. 导入html和css,js,images,存放到static目录

  2. 编写对应的路由和视图
    在这里插入图片描述

  3. 测试页面是否可以在浏览器使用
    在这里插入图片描述

  4. 修改静态文件的路径
    由于静态资源路径不正确,需要重写路径

   ctrl + r    查找并替换
   ctrl + f    查找
   shift + ctrl +f 跨文件查找

将所有js/和images/和css/文件查找到替换为/static/js/
在这里插入图片描述

  1. 修改a标签地址

注意要将路径前修多加/表示根目录,否则会在原地址处多加index
在这里插入图片描述

三、模板继承

在实际开发当中,使用前端开发好的静态页面,页面当中有很多重复的东西,为了能够简单操作,复用代码,可以使用模板继承解决

1. 创建一个base.html(里面的内容为所有html的公共部分)

在这里插入图片描述
base.html作为父类模板
调用base页面
在这里插入图片描述
对于不同的地方,无论是css文件还是中央内容,我们可以采用块儿占位

{% block 块名字%}
{% endblock%}

别的html继承该父类html,将自己不同的地方写入快中即可,例如:

{% extends  'base.html'%}
{% block 块名字%}
	<h1>222</h1>
{% endblock%}

2. 修改子类模板
在这里插入图片描述

四、模型创建

from django.db import models
from ckeditor.fields import RichTextField

#创建一个user表,进行登录验证
class User(models.Model):
    username=models.CharField(max_length=32,verbose_name='用户名')
    password=models.CharField(max_length=32,verbose_name='密码')
    email=models.CharField(max_length=32,verbose_name='邮箱',default='123@qq.com')

    def __str__(self):
        return self.username
    class Meta:
        db_table='user'
        verbose_name='用户表'
        verbose_name_plural=verbose_name


#作者表
class Author(models.Model):
    name=models.CharField(max_length=32,verbose_name='作者名字')
    age=models.IntegerField(verbose_name='年龄')
    # gender=models.CharField(max_length=8,verbose_name='性别')
    gender=models.IntegerField(choices=((1,'男'),(2,'女')),verbose_name='性别')
    email=models.CharField(max_length=32,verbose_name='电子邮件')

    def __str__(self):
        return self.name

    class Meta:
        db_table='author'
        verbose_name='作者'
        verbose_name_plural=verbose_name


class Type(models.Model):
    name=models.CharField(max_length=32,verbose_name='名字')
    description=models.TextField(verbose_name='描述')

    def __str__(self):
        return self.name

    class Meta:
        db_table='type'
        verbose_name='类型'
        verbose_name_plural=verbose_name


class Article(models.Model):
    title=models.CharField(max_length=32,verbose_name='标题')
    date=models.DateField(auto_created=True,verbose_name='日期')
    # content=models.TextField()
    content=RichTextField()
    # description=models.TextField(verbose_name='描述')
    description=RichTextField()
    #图片类型
    #upload_to指定文件上传位置,需要和static下的路径相同
    picture=models.ImageField(upload_to='images')
    #推荐和点击率
    recommend=models.IntegerField(verbose_name='推荐',default=0)
    click=models.IntegerField(verbose_name='点击率',default=0)
    author=models.ForeignKey(to=Author,on_delete=models.SET_DEFAULT,default=1)
    type=models.ManyToManyField(to=Type)

    def __str__(self):
        return self.title
    class Meta:
        db_table='article'
        verbose_name='文章'
        verbose_name_plural=verbose_name

修改作者性别字段属性
在这里插入图片描述
choices属性:由元组组成的一个可迭代对象,用来给字段提供可选值。
在这里插入图片描述

五、分页器进行分页

一般分为两种:

  • 前端分页
    • 后端将数据一次性全部提供给前端,前端通过js进行分页
    • 优点:简单直接
    • 缺点:传输数据需要时间,对数据库压力大
  • 后端分页
    • 在数据库查询时,指定查询范围,类似于sql中的limit,ORM中的切片。

django中提供了分页插件,paginator,专门负责提供分页功能,在django1.4版本之后才有。

1.文章表增加100条数据

我们先创建个方法,快速往数据库增加100条文章
在这里插入图片描述

2.分页提供的方法


from django.core.paginator import Paginator
def fytest(request):
    ## 使用django自带分页 Paginator 的时候 原数据要增加排序属性
    article = Article.objects.all().order_by("-date")
    # print(article)
    #  每次显示 5条数据
    paginator = Paginator(article,5)   # 设置每一页显示多少条,返回一个Paginator 对象
    # print (paginator.count)    ##   返回内容总条数
    # print(paginator.page_range)   ## 可迭代的页数
    # print(paginator.num_pages)    ## 最大页数

    page_obj= paginator.page(2)
    print (page_obj)   ##   可以有的页数的数据  表示的当前对象  <Page 20 of 21>
    for one in page_obj:
        print (one.content)

    # print(page_obj.number)   ## 当前页数
    # print(page_obj.has_next())   ## 有没有下一页 返回值  是True 或者 Flase
    # print(page_obj.has_previous())  ## 判断是否有上一页   是True 或者 Flase
    # print(page_obj.has_other_pages())  ## 判断是否有其他页   是True 或者 Flase
    # print(page_obj.next_page_number())  # 返回 下一页的页码   如果没有下一页 抛出异常
    # print(page_obj.previous_page_number())  ## 返回上一页的页码

    return HttpResponse("分页功能测试")

3.博客系统分页的实现

1.添加路由

path('newslistpic/', views.newslistpic),
re_path('newslistpic/(?P<page>\d+)', views.newslistpic),

2.添加视图
在这里插入图片描述
3.添加模板
在这里插入图片描述
4.前端展示的页数

我们要实现:展示指定5页
 					 5-2    3 4 5  6 7     5 + 2

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

def newslistpic(request,page=1):
    page=int(page)
    # 根据新闻类型查所有的新闻
    type_id = request.GET.get('type')
    if not type_id:
        type_id = 1
    news_type = News_Type.objects.get(id=int(type_id))
    queryset = Article.objects.filter(news_type=news_type).order_by('-id')
    paginator = Paginator(queryset,6)
    page_obj=paginator.page(page)
    #获取当前页
    current_page=page_obj.number
    start=current_page-3
    if start<1:
        start=0
    end=current_page+2
    if end>paginator.num_pages:
        end=paginator.num_pages
    if start==0:
        end=5
    page_range=paginator.page_range[start:end]
    return render(request, 'newslistpic.html', locals())

②模板
在这里插入图片描述

<div class="pagelist">
                <a href="/news_show/newslistpic/1">首页</a>
                {% if page_obj.has_previous %}
                    <a href="/news_show/newslistpic/{{ page_obj.previous_page_number }}">上一页</a>
                {% endif %}
                {% for page in page_range %}
                    <a href="/news_show/newslistpic/{{ page }}">{{ page }}</a>
                {% endfor %}
                {% if page_obj.has_next %}
                    <a href="/news_show/newslistpic/{{ page_obj.next_page_number }}">下一页</a>
                {% endif %}
                <a href="/news_show/newslistpic/{{ paginator.num_pages }}">尾页</a>
            </div>
        </div>
    </div>

六、媒体文件的使用

在django开发中,除了静态文件,还有媒体文件(视频,声音,图片),将文件上传到服务器上面,首先需要一个文件处理模块(例如:PIL(python2版本) 和 pillow 一样,作用就是处理图片的,参与人工智能,数据分析),其次需要文件的存储位置。

1.安装 pillow

虚拟环境安装pillow
[外链图片转存失败(img-d8P9t6fq-1568732467439)(day06.assets/1568618261762.png)]

2.配置

[外链图片转存失败(img-5LgbxD1U-1568732467440)(day06.assets/1568620134008.png)]

修改模型

[外链图片转存失败(img-l1HxfZFJ-1568732467441)(day06.assets/1568620267199.png)]

数据迁移

在这里插入图片描述

使用图片

[外链图片转存失败(img-UyqTfoHl-1568732467443)(day06.assets/1568620903592.png)]

[外链图片转存失败(img-aUvYj8Tq-1568732467444)(day06.assets/1568620920304.png)]

站点管理

[外链图片转存失败(img-6wxRAunu-1568732467444)(day06.assets/1568620940666.png)]

七、富文本编辑器 Ckeditor

Ckeditor 一种成熟的富文本编辑器,于django结合的比较好

1.安装模块

pip install django-ckeditor

2.配置

settings.py

[外链图片转存失败(img-X79dEw41-1568732467446)(day06.assets/1568621571558.png)]

[外链图片转存失败(img-E657JC3e-1568732467446)(day06.assets/1568621607799.png)]

路由

[外链图片转存失败(img-L78StKgD-1568732467447)(day06.assets/1568621700227.png)]

3.使用

[外链图片转存失败(img-8GZ37K8I-1568732467447)(day06.assets/1568621845394.png)]
[外链图片转存失败(img-o3WGdhfh-1568732467448)(day06.assets/1568621861852.png)]
html

[外链图片转存失败(img-N7TPORqQ-1568732467449)(day06.assets/1568622088727.png)]

[外链图片转存失败(img-JUc7dX92-1568732467450)(day06.assets/1568622106401.png)]
修改index页-模型中增加字段

[外链图片转存失败(img-n7aqNd4Y-1568732467451)(day06.assets/1568623081930.png)]

数据迁移-ORM操作

[外链图片转存失败(img-T5YRYMR9-1568732467451)(day06.assets/1568623557773.png)]

修改视图

[外链图片转存失败(img-WZ0l0G2B-1568732467452)(day06.assets/1568623586427.png)]
修改页面 index.html

{#继承父类模板#}
{% extends "base.html" %}

{% block content %}
    <div class="jztop"></div>
    <div class="container">
        <div class="bloglist f_l">
            {% for article in article %}

            <h3><a href="/articledetails/{{ article.id }}">{{ article.title }}</a></h3>
            <figure><img src="/static/{{ article.picture }}" alt="{{ article.title }}"></figure>
            <ul>
                <p> {{ article.description | safe }}</p>
                <a title="{{ article.title }}" href="/articledetails/{{ article.id }}" target="_blank" class="readmore">阅读全文&gt;&gt;</a>
            </ul>
            <p class="dateview"><span>{{ article.date }}</span><span>作者:{{ article.author }}</span><span>个人博客:[<a href="/jstt/bj/">{{ article.type.first }}</a>]</span>
            </p>

            {% endfor %}


        </div>
        <div class="r_box f_r">
            <div class="tit01">
                <h3 class="tit">关注我</h3>
                <div class="gzwm">
                    <ul>
                        <li><a class="email" href="#" target="_blank">我的电话</a></li>
                        <li><a class="qq" href="#mailto:admin@admin.com" target="_blank">我的邮箱</a></li>
                        <li><a class="tel" href="#" target="_blank">我的QQ</a></li>
                        <li><a class="prize" href="#">个人奖项</a></li>
                    </ul>
                </div>
            </div>
            <!--tit01 end-->

            <div class="tuwen">
                <h3 class="tit">图文推荐</h3>
                <ul>
                    {% for tuwen in recommend_article %}
                    <li><a href="/articledetails/{{ tuwen.id }}"><img src="/static/{{ tuwen.picture }}"><b>{{ tuwen.title }}</b></a>
                        <p><span class="tulanmu"><a href="articledetails/{{ tuwen.id }}">{{ tuwen.type.first }}</a></span><span class="tutime">{{ tuwen.date }}</span></p>
                    </li>
                    {% endfor %}

                </ul>
            </div>
            <div class="ph">
                <h3 class="tit">点击排行</h3>
                <ul class="rank">
                    {% for paihang in click_article %}
                    <li><a href="/articledetails/{{ paihang.id }}" title="{{ paihang.title }}" target="_blank">{{ paihang.title }}</a>
                    </li>
                    {% endfor %}

                </ul>
            </div>
            <div class="ad"><img src="/static/images/03.jpg"></div>
        </div>
    </div>
    <!-- container代码 结束 -->
    <div class="jzend"></div>

{% endblock %}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
Python Django文本编辑器可以通过使用第三方库和插件来实现上传功能。常用的方法是使用django-ckeditor库或django-tinymce库来集成文本编辑器以及上传功能。 首先,在Django项目安装所需的库,可以通过在终端运行以下命令安装库: ```python pip install django-ckeditor pip install django-tinymce ``` 安装完成后,需要在Django的设置文件进行相应的配置。对于django-ckeditor库,需要将以下内容添加到settings.py的INSTALLED_APPS和STATIC_URL: ```python INSTALLED_APPS = [ ... 'ckeditor', ] STATIC_URL = '/static/' STATICFILES_DIRS = [ ... os.path.join(BASE_DIR, 'static') ] ``` 对于django-tinymce库,需要将以下内容添加到settings.py的INSTALLED_APPS和STATIC_URL: ```python INSTALLED_APPS = [ ... 'tinymce', ] STATIC_URL = '/static/' STATICFILES_DIRS = [ ... os.path.join(BASE_DIR, 'static') ] ``` 然后,需要在urls.py文件添加相应的URL配置。对于django-ckeditor库,可以添加以下代码: ```python from django.contrib import admin from django.urls import include, path from django.conf import settings from django.conf.urls.static import static from ckeditor_uploader import views as ckeditor_views urlpatterns = [ ... path('ckeditor/', include('ckeditor_uploader.urls')), path('admin/', admin.site.urls), ] if settings.DEBUG: urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) ``` 对于django-tinymce库,可以添加以下代码: ```python from django.contrib import admin from django.urls import include, path from django.conf import settings from django.conf.urls.static import static from tinymce import views as tinymce_views urlpatterns = [ ... path('tinymce/', include('tinymce.urls')), path('admin/', admin.site.urls), ] if settings.DEBUG: urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) ``` 最后,还需要进行一些前端和后端的配置。具体可以参考文档或库的使用说明来实现上传功能。 以上就是使用Python Django文本编辑器实现上传功能的简要步骤。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

张烫麻辣亮。

谢谢老板支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值