如何使用Django框架编写自己的blog系统
创建项目
step_1
首先创建一个新项目FirstBlog(以下简称FB),实现基础功能,如创建数据库,创建超级用户,可以实现后台管理员登陆
过程可参考[链接描述][1]
注册应用
step_2
在FB中注册应用blog,编写数据库文件blog/models.py,告诉主程序FirstBlog/settings.py你注册了应用,并修改数据库
后台运行前,需要在blog/admin.py中注册站点
博客属性:id,博客标题,博客作者,博客摘要,博客正文,博客创建时间,博客所属专栏(类别),博客标签,阅读数
标签属性:id,标签名称
专栏(类别)属性:id,专栏名称
博客和专栏: 多对一
博客和标签: 多对多
与flask的数据库表结构不同,django框架里,数据库表之间的关联只需要在对应关系里多的一侧写外键ForeignKey,不需要在另一个表写反向引用。如果是多对多的关系,可在任意一端写ManyToManyField。
# blog/models.py
from django.contrib.auth.models import User
from django.db import models
# Create your models here.
# 博客属性:id,博客标题,博客作者,博客摘要,博客正文,博客创建时间,博客所属专栏(类别),博客标签,阅读数,评论数
# 标签属性:id,标签名称
# 专栏(类别)属性:id,专栏名称
# 博客和专栏: 多对一
# 博客和标签: 多对多
class Category(models.Model):
name = models.CharField(max_length=64, verbose_name='专栏名称')
class Meta:
verbose_name = '专栏'
verbose_name_plural = '专栏'
def __str__(self):
return '%s' %(self.name)
class Tag(models.Model):
name = models.CharField(max_length=64, verbose_name='标签名称')
class Meta:
verbose_name = '标签'
verbose_name_plural = '标签'
def __str__(self):
return '%s' %(self.name)
class Post(models.Model):
title = models.CharField(max_length=100, unique=True, verbose_name='标题')
create_time = models.DateTimeField(verbose_name='创建时间')
summary = models.CharField(max_length=255, verbose_name='摘要')
body = models.TextField(verbose_name='正文')
# 作者可以从管理员数据库表User中查找
author = models.ForeignKey(User, verbose_name='作者')
category = models.ForeignKey(Category, verbose_name='专栏')
tags = models.ManyToManyField(Tag, verbose_name='标签')
views = models.IntegerField(default=0,verbose_name='阅读数')
class Meta:
verbose_name = '博客'
verbose_name_plural = '博客'
def __str__(self):
return '%s' %(self.title)
创建数据
step_3
后台创建多个标签、栏目,多篇博客,确保前端显示是有数据的。
构造路由
step_4
构建路由和视图函数,并告诉主路由函数FirstBlog/settings.py如何查找
前端显示
step_5
创建静态模板目录static/,修改模板文件,settings.py文件的static配置。如果没有修改settings.py文件,可在模板文件加上{% load static%}。并修改样式(css...)的位置
根据使用的网页模板,显示自己的页面
显示结果:
如何快速准确跳转页面
from django.urls import reverse #返回正确而完整的路由
为了在html文件内,继续阅读可以直接跳转{{ post.get_url }}
注意在重写视图函数名称时,需要申明命名空间
修改blog/models.py的Post表,添加属性get_url()
#blog/models.py
def get_url(self):
return reverse('blog:detail',kwargs={'id':self.pk})
#blog/urls.py
from django.conf.urls import url
from django.contrib import admin
from blog import views
app_name = 'blog'
urlpatterns = [
url(r'^$',views.index ,name='index'),
url(r'book/(?P<id>\d+)/$',views.detail,name='detail' ),
]
阔以看见html文件的‘继续阅读’会自动链接到博客详情页
{#templates/blog/index.html 部分代码#}
<div class="read-more cl-effect-14">
<a href="{{ post.get_url }}" class="more-link">继续阅读 <span
class="meta-nav">→</span></a>
</div>
正文显示使用markdown语法
现在的博客都是使用mrkdown语法来显示的,并且配备高亮显示
需要下载安装模块Markdown,pygments
在视图函数里将博客正文转成html时,加上高亮的ectensions
修改base.html,添加对应高亮的css样式
#blog/views.py文件
post.body = markdown(
post.body,
extensions=['markdown.extensions.extra',
'markdown.extensions.codehilite',
'markdown.extensions.toc', ],
output_format='html'
)
{#templates/blog/detail.html 部分代码#}
<div class="entry-content clearfix">
{{ post.body | safe}}
</div>
{#templates/base.html 部分代码#}
{# 代码高亮显示的样式#}
<link rel="stylesheet" href="/static/css/highlights/github.css">
增加阅读量
修改数据库表结构,添加增加阅读量的方法
#blog/models.py
# 增加阅读量
def add_views(self):
self.views +=1
self.save(update_fields=['views']) #只重新保存更新字段views
修改视图函数,当你访问某一篇博客时,阅读量加1
post = Post.objects.get(id=id)
post.add_views()
阔以从图上看出,阅读量的增加
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。