文章目录
一、创建工程和配置过程
- 一、创建工程和配置过程
- 二、导入前端模板
- 三、模板继承
- 四、模型创建
- 五、分页器进行分页
- 1.文章表增加100条数据
- 2.分页提供的方法
- 3.博客系统分页的实现
- 六、媒体文件的使用
- 1.安装 pillow
- 2.配置
- 七、富文本编辑器 Ckeditor
- 1.安装模块
- 2.配置
- 3.使用
1.创建项目
在命令行输入
python mange.py startproject myblog
2.配置-打开项目
- 创建一个views文件
- urls.py 中导入views
- 创建templates 和static 目录
- 将静态文件和templates设置
-
导入html和css,js,images,存放到static目录
-
编写对应的路由和视图
-
测试页面是否可以在浏览器使用
-
修改静态文件的路径 由于静态资源路径不正确,需要重写路径
ctrl + r 查找并替换
ctrl + f 查找
shift + ctrl +f 跨文件查找
将所有js/和images/和css/文件查找到替换为/static/js/
- 修改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条文章
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 %}
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?