一、路由的写法
使用别名
二、修改页面
博客项目连接
(一)修改个人日记页面
修改文章模型的性别属性
choices属性:由元组组成的一个可迭代对象,用来给字段提供可选值。
想查询值时,可以使用如下方法:
修改视图
修改模板
(二)增加文章详情页
路由
视图
修改模板newslistpic.html
新建articledetails.html模板
三、分页
(一)添加大量数据
路由
视图
分页:一个页面显示太多数据,效果不好需要分页处理
一般分为两种:
- 前端分页
- 后端将数据一次性全部提供给前端,前端通过js进行分页
- 优点:简单直接
- 缺点:传输数据需要时间,对数据库压力大
- 后端分页
- 在数据库查询时,指定查询范围,类似于sql中的limit,ORM中的切片。
django中提供了分页插件,paginator,专门负责提供分页功能,在django1.4版本之后才有。
(二)分页的常用方法
from django.core.paginator import Paginator
def pagetest(request):
# 使用django自带分页Paginator的时候,源数据需要增加排序属性,否则会报异常
article = Article.objects.all().order_by('-date')
paginator = Paginator(article,5) # 设置每页显示的数据条数,返回一个对象
print(paginator.count) # 返回内容总条数
print(paginator.page_range) # 可迭代页数范围
print(paginator.num_pages) # 返回最大页数
page = paginator.page(5)
print(page) # <Page 5 of 21>,表示当前对象
for one in page:
print(one.content)
print(page.number) # 5,当前页
print(page.has_next()) # 是否有下一页
print(page.has_previous()) # 是否有上一页
print(page.has_other_pages()) # 是否有其他页
print(page.next_page_number()) # 下一页的页码,如果没有,抛异常
print(page.previous_page_number()) # 上一页的页码,如果没有,抛异常
return HttpResponse('分页功能测试')
(三)实现分页
视图
路由
第一个是防止由其他页面跳转时产生让出现错误
模板
结果
但是这样如果页数太多,效果不好。
(四)优化
每次显示五个页码,并添加上一页、下一页、首页、尾页
视图
模板
四、图片
在django开发中,除了静态文件,还有媒体文件(视频,声音,图片),将文件上传到服务器上面,首先需要一个文件处理模块(例如:PIL(python2模块)和pillow一样,作用就是处理图片的,参与人工智能,数据分析),其次需要文件的存储位置。
1.安装pillow
2.配置settings.py
3.修改模型
4.数据迁移
5.使用图片
五、富文本
Ckeditor,它是一种成熟的富文本编辑器,与django结合的较好。
1.安装ckeditor
2.配置settings.py
3.路由
使用
1.导包
2.修改字段类型
3.数据迁移
4.站点管理
5.前端显示
修改模板文件
六、修改index页面
1.模型中增加字段
2.数据迁移
3.ORM操作,更新文章的recommend字段
终端执行
python manage.py shell
然后运行如下代码
4.修改视图
5.修改模板
{#继承父类模板#}
{% extends "base.html" %}
{% block content %}
<div class="jztop"></div>
<div class="container">
<div class="bloglist f_l">
{% for one in article %}
<h3><a href="/articledetails/{{ one.id }}">{{ one.title }}</a></h3>
<figure><img src="/static/{{ one.picture }}" alt="{{ one.title }}"></figure>
<ul>
<p> {{ one.description |safe }}</p>
<a title="{{ one.title }}" href="/articledetails/{{ one.id }}" target="_blank" class="readmore">阅读全文>></a>
</ul>
<p class="dateview"><span>{{ one.date }}</span><span>作者:{{ one.author }}</span><span>个人博客:[<a href="/jstt/bj/">{{ one.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 one in recommend_article %}
<li><a href="/articledetails/{{ one.id }}"><img src="/static/{{ one.picture }}"><b>{{ one.title }}</b></a>
<p><span class="tulanmu"><a href="articledetails/{{ one.id }}">{{ one.type.first }}</a></span><span class="tutime">{{ one.date }}</span></p>
</li>
{% endfor %}
</ul>
</div>
<div class="ph">
<h3 class="tit">点击排行</h3>
<ul class="rank">
{% for one in click_article %}
<li><a href="/articledetails/{{ one.id }}" title="{{ one.title }}" target="_blank">{{ one.title }}</a></li>
{% endfor %}
</ul>
</div>
<div class="ad"> <img src="/static/images/03.jpg"> </div>
</div>
</div>
<!-- container代码 结束 -->
<div class="jzend"></div>
{% endblock %}