基于django的简单博客系统

0x01

花了几天时间看了点django,也算是入了门吧,开发了一个很简单的博客,基于 django & bootstrap, 记录一下开发的大体过程。

项目地址:https://github.com/tkcharlotte/easyblog

django,一个python的web框架,另一个就框架就是flask了,django采用MVC模式,M(模型) V(视图) C(控制器)三部分,在django体现的就是 模型、模板、视图这几部分。下面说点具体的东西。。。

0x02

  • 目录结构介绍

安装就不说了,网上一百度一大把的教程,照着来就行了,安装完成以后,就要开始创建项目了。
使用django-admin startproject project_name 创建项目,然后进入到项目的根目录下,创建一个应用(app),使用 python manage.py startapp app_name 命令。以我的项目为例,介绍一下整个的结构:

1
2
3
4
5
6
7
8
9
10
11
│ db.sqlite3
│ manage.py
└─myblog
settings.py
settings.pyc
urls.py
urls.pyc
wsgi.py
wsgi.pyc
__init__.py
__init__.pyc

django默认使用sqlite数据库,生成项目的时候会生成一个sqlite的数据库db.sqlite3,
manage.py:一种命令行工具,与项目进行交互,python manage.py help 查看所有操作
再看myblog目录,创建项目时会生成一个与项目名相同的目录,目录下包括了一些比较重要的文件

setting.py: 一看就是项目的配置文件,目前用到的部分有以下几个:
LANGUAGE_CODE 默认为英语,可以修改成zh-hans表示中文,
TEMPLATES 模板文件,添加非默认的模板
INSTALLED_APPS 加载的应用,创建的应用要添加到这里。
DATABASES 选择数据库,如果不想用默认的sqlite,可以在这个地方修改。
MIDLEWEAR 工具集
urls.py :url配置文件,每个URL地址都需要我们去配置,去规定每个url的操作。
init.py :为空 表明这是一个模块,默认即可
wsgi.py:Python服务器网关接口,是python应用与Web服务器之间的接口。部署项目的时候会用的到。

拿到一个具体的应用目录来说:

1
2
3
4
5
6
7
8
9
10
11
12
13
│ admin.py
│ admin.pyc
│ apps.py
│ models.py
│ models.pyc
│ tests.py
│ views.py
│ views.pyc
│ __init__.py
│ __init__.pyc
├─migrations
├─static
├─templates

admin.py:后台管理系统
app.py:应用的一些配置,1.9之后自动生成的,所以。。基本可以不用。。
models.py :数据模块,使用ORM框架,
test.py: 测试的模块
view.py:响应的模块,对逻辑的处理,项目值大部分代码基本都是在这写的。。

  • 基本编写思路

前面说创建一个应用,要把应用名添加到setting.py的INSTALLED_APPS中,因为是一个博客系统,所以肯定要有文章,我们model.py中定义一个类,

1
2
3
4
5
6
7
8
class Article(models.Model):
title = models.CharField(u"博客标题",max_length = 100) #博客标题
category = models.CharField(u"博客标签",max_length = 50,blank = True) #博客标签
pub_date = models.DateTimeField(u"发布日期",auto_now_add = True,editable=True) #博客发布日期
update_time = models.DateTimeField(u'更新时间',auto_now=True,null=True)
content = models.TextField(blank=True, null=True) # 博客文章正文
def __unicode__(self):
return self.title

可以这么理解,一个类代表数据库中的一个表,其中定义的这些字段就是表中的字段,自己也可以用工具把根目录下的sqlite数据库打开看一下,验证一下自己的想法。至于具体的语法请自行百度,这里只是说个思路,我们在文章这个类中定义了标题、分类、发布日期、内容等这几个字段,然后在admin.py中,我们可以这么写,

1
2
3
4
5
6
7
8
9
from __future__ import unicode_literals
from django.contrib import admin
from .models import Article,Author
class ArticleAdmin(admin.ModelAdmin):
list_display = ('title','pub_date','category')
admin.site.register(Article,ArticleAdmin)

定义一个类,继承admin.ModelAdmin,list_display 这一行指的是要在后台显示的字段,最后要注册一下,需要注意的一点是要import一下Article这个类,不然会报错。
现在我们在后台添加一篇文章,怎么在页面显示出来呢?
这个时候要用到我们的views.py这个文件,定义一个函数:

1
2
3
def index(request):
post = Article.objects.all()
return render(request,'index.html',{'post':post})

前面我们定义的一个article类,也就是一张表,post这一行就是把表中的数据取出来,就是select * from article 这样看就顺眼多了吧,然后把表中的字段内容展示在index.html,让博客首页显示的就是文章的标题,这样的话,我们需要在urls.py中添加一条路由规则,

1
url(r'^$',blog_views.index),

正则表达式,访问根目录的时候,调用index这个函数,也就是我们前边在views.py中定义的那个函数,需要注意的是在urls.py中药先import 应用名,不然会报错。

现在还缺一个页面,我们在应用目录下新建一个templates目录,顾名思义,存放html模板的地方。新建一个index.html,开始编写我们的页面,要注意的是,django模板有自己的语法,写的是要符合语法。刚开始也不求什么好看的页面了。。。先实现最基本的功能,所以写个最简单的:

1
2
3
4
{% for p in post %}
<h2>{{ p.title}}</h2>
<p>{{ p.content }}</p>
{% endif %}

一个for循环,展示表中特定字段的内容,具体的语法自己查询资料,
好了,现在我们理一下思路,在后台写入数据,写一个视图函数取出数据,展示在前端页面上,要在url中添加路由,每一个url都要对应相应的路由,否则就会报错,最基本的一个页面就写完了,
如果想要一个好看的前端,就套上一个专门的前端模板,前端的css js image 等静态的东西一般放在static这个目录,html文件一般放在templates这个目录,我用的是bootstrap提供的一个博客前端模板,要注意的是静态文件的路径问题,否则css不加载。看着贼难受==、

  • 文章详情页

文章详情页是必须要有的,点击文章标题,在新的页面展示文章内容,说一下思路。
想法是点击某一篇文章,跳转到新的页面,新页面的url为/article/文章id这样的形式,在urls.py中添加这么一行路由

1
url(r'^article/(?P<article_id>[0-9]+)/$',blog_views.article),

后面这一部分正则,匹配的是article_id为数字,然后调用article这个函数,那么,怎么标识不同的文章呢?每一篇文章说到底还是数据库中的数据,有一个对应的id,可以看下图:

也可以打开migartions下的文件看一下,有一个默认的id字段,所以我们用id这个字段来标识不同给的文章。
于是这么写视图函数:

1
2
3
def article(request,article_id):
article = Article.objects.get(id = article_id)
return render(request,'view.html',{'article':article})

object.get 相当于 select * from xxx where id =x

在模板中直接暴力一点,这么写:

1
<a href="/article/{{p.id}}" target="_blank">

p.id传到视图函数那,对应article_id这个参数,url中正则表达式那个地方的参数要跟视图函数的参数保持一致,还有一种与命名空间有关的写法。。。暂时没成功。。。

  • markdown支持
    markdown写出东西简洁明了大方,这么好的东西怎么能不用呢? 网上有专门的插件 –>django-markdown-deux 加上就ok了
    附上详细链接:戳这里~
  • 文章分页
    文章写的越来越多,不看呢过全部展示在一个页面上,分页是必须的,看了看网上的写法,都是用的pagination来写的。。感觉有点麻烦而且容易写错,找到了一个前人集成好的第三方库,直接用就ok了。。。
    第三方库的详细信息戳这里~

0x03

这几天学这点东西没少踩坑,。。有坑必跳==。前端的东西不会是真心gg………
第三方库版本的变化,修改了一些地方。。网上的文章都跟不上变化==说多了都是泪。不过自己摸索的这几天还是学到了不少东西,学习东西的最好方式就是去实践,这话没毛病~~
博客概念股能尚不完善,以后再慢慢往上加……

本文标题:基于django的简单博客系统

文章作者:tkcharlotte

发布时间:2017年08月09日 - 17:08

最后更新:2018年02月07日 - 18:02

原始链接:boombao.net/2017/08/09/django简单博客/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

-------------本文结束感谢您的阅读-------------