您当前的位置: 首页 >  编辑器
  • 0浏览

    0关注

    214博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

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

不愿透露姓名の网友 发布时间:2019-09-21 14:34:51 ,浏览量:0

文章目录
  • 一、创建工程和配置过程
  • 二、导入前端模板
  • 三、模板继承
  • 四、模型创建
  • 五、分页器进行分页
    • 1.文章表增加100条数据
    • 2.分页提供的方法
    • 3.博客系统分页的实现
  • 六、媒体文件的使用
    • 1.安装 pillow
    • 2.配置
  • 七、富文本编辑器 Ckeditor
    • 1.安装模块
    • 2.配置
    • 3.使用

一、创建工程和配置过程

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 块名字%}
	222
{% 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)   ##   可以有的页数的数据  表示的当前对象  
    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\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 startpaginator.num_pages:
        end=paginator.num_pages
    if start==0:
        end=5
    page_range=paginator.page_range[start:end]
    return render(request, 'newslistpic.html', locals())

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


                首页
                {% if page_obj.has_previous %}
                                
关注
打赏
1657102503
查看更多评论
0.0441s