文章目录
一、创建工程和配置过程
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 块名字%}
<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
2.配置
修改模型
数据迁移
使用图片
站点管理
七、富文本编辑器 Ckeditor
Ckeditor 一种成熟的富文本编辑器,于django结合的比较好
1.安装模块
pip install django-ckeditor
2.配置
settings.py
路由
3.使用
html
修改index页-模型中增加字段
数据迁移-ORM操作
修改视图
修改页面 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">阅读全文>></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 %}