做一个博客,项目名为TodoBlog, 应用名为blog

本文是用python+Django实现一个简单的博客网站,博客的功能包括:

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。
  • 显示文章列表
  • 显示文章内容
  • 添加文章
  • 修改文章

1、环境准备:

  本项目用到的是一下几个工具及版本:Python3.7 、Django2.0.7、SQLite Expert Personal数据库查看工具、python项目编辑器--Pycharm

  查看python版本的命令是:python

  查看Django版本的命令是:python -m Django --version

 

2、创建项目

  打开命令行,切换到自定的项目目录下,输入命令 django-admin startproject 项目名 ,回车;如 django-admin startproject TodoBlog

  打开执行命令的路径下,可以看到多了一个TodoBlog的文件夹,文件夹下面有一个manage.py文件和TodoBlog文件夹:

    项目目录结构:

      manage.py    相当于Django的一个大管家,很多功能都需要manage.py来协助实现,输入python manage.py可看到manage.py的功能;       TodoBlog(是项目的一个容器)              __init__.py   (Python中声明模块的文件(任何文件下有__init__.py文件的,都被认作是一个模块),内容默认为空)              settings.py   (重要的配置文件)              urls.py   (URL配置文件)              wsgi.py(WSGI:Python Web Server Gateway Interface Python服务器网关接口,是Python应用于Web服务器之间的接口)

 

3、创建应用

  项目相当于一个大环境,或者说是一个容器,实际使用时,需要创建应用。

  创建应用:在manage.py文件同级路径下,输入命令:python manage.py startapp blog

  查看应用情况:打开目录,在manage.py文件同级路径下,可看到多了一个名为blog的文件夹

   应用目录结构:
    •   migrations   (数据移植(迁移)模块,自动生成)
      •  __init__.py
    •   __init__.py   
    •   admin.py    (该应用的后台管理系统配置)
    •   apps.py    (该应用的一些配置,Django-1.9后自动生成)
    •   models.py    (数据模块,使用ORM框架,类似于MVC中的Models模块,在该文件中创建类即创建了一个表,添加类的属性即为该表创建了相应的表字段,当然,代码编写完成后 ,需要做数据迁移才能实现真正创建表和表字段)
    •   tests.py      (自动化测试模块,在这里编写测试脚本)
    •   views.py    (执行响应的代码所在模块,代码逻辑处理的主要地点,项目中大部分的代码均在这里编写)

 

4、将新创建的应用添加到settings.py的应用配置中

  所有的应用都需要添加到项目的settings.py的INSTALLED_APPS的变量中,如下,添加blog应用,其他都是创建项目时Django自带的:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'blog',
]

 

5、使用到的模块介绍

  • views.py  这个模块属于后端的功能实现,与前端的交互,接收前端的请求等;(重点重点)
  • templates  
    • 模板模块,其实在web项目中,很多web页面的排版,格式都是一样的,只是里面的数据内容不一样,为同一类的web页面创建一个模板,即创建一个HTML文件,将改动的数据用获取变量值的方式来实现;
    • 使用方法是:在应用中添加templates文件夹,在文件夹下创建HTML文件
  • admin   admin是Django自带的后台管理系统,方便对数据库数据进行操作,例如增删查改等,admin中的字段与models模块创建的字段有关联
  • models 
    •  创建数据库表字段,在该文件中新建一个继承models.Model的class,这个类即为一个表,在class中的属性即为这个表中的字段;
    • 当然,并不是直接创建文件,创建一个类和类属性就能实现创建表的,中间有一个步骤,叫数据迁移,即将models--class下创建的表及表字段,利用Django封装好的SQL功能创建表,具体步骤是:
    1. python manage.py makemigrations
    2. python manage.py migrate
    • 创建的表的情况,会以SQLite的文件格式存放在与manage.py同级的目录下,可通过SQLite Expert Personal工具打开;
    • 注意:::每一次在models添加类或类属性是,都需要做数据迁移才能真正的创建表或添加表字段

 

6、为博客创建必要的字段

  models.py文件代码

from django.db import models

# Create your models here.

class Article(models.Model):
    title = models.CharField(max_length=32, default='Title')#文章名
    content = models.TextField(null=True)  #内容允许为空
    pub_time = models.DateTimeField(null=True)  #更新时间

    def __str__(self):
        return self.title

 

7、在admin文件中添加models.py创建的字段 

from django.contrib import admin

from .models import Article
# Register your models here.

class ArticleAdmin(admin.ModelAdmin):
    list_display = ('title', 'content', 'pub_time')
    list_filter = ('pub_time',)   #过滤器

admin.site.register(Article, ArticleAdmin)

 

8、数据迁移

 注意,上文说到,在models修改了表结构后,需要做数据迁移才能实现真正意义上的修改。

  在命令行执行命令:

    1. python manage.py makemigrations
    2. python manage.py migrate

 查看表创建情况:

  • 方法一:在TodoBlog项目目录下,多了一个名为db.sqlite3的文件,可用SQLite Expert Personal工具打开,打开后,在应用下可看到表已创建;
  • 方法二:打开admin控制台,查看方法,但是只有表中有数据才能用这种方法
    1. 使用manage.py创建admin的用户名和密码,命令为:python manage.py createsuperuser
    2. 启动项目服务器:python manage.py runserver
    3. 打开blog网页登录  http://127.0.0.1:8000/admin/

9、创建HTML文件

  实现简单博客网站,使用HTML作前端展示和发送请求,后端使用Django自带的views.py接收请求并处理。

  博客实现的功能有:显示文章列表、显示文章内容、添加文章、修改文章。

  

  blog页面有三个:

    • 主页:index

        显示所有的文章列表,通过点击这些列表进入到文章内容中,并有一个编写新文章的入口

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>Title</title>
 6 </head>
 7 <body>
 8 <h1>
 9     <a href="{% url 'blog:edit_page' 0 %}">新文章</a>
10 </h1>
11 {% for article in articles %}
12     <a href="{% url 'blog:article_page' article.id %}">{{ article.title }}</a>
13     <br/>
14 {% endfor %}
15 </body>
16 </html>

 

    • 新文章、编辑文章:edit_page

        如果是新文章,就显示title和content都为空,如果只是编辑文章的话,title和content的输入框显示之前编写的内容,输入框可以进行修改,修改文章后的提交按钮

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>Edit Page</title>
 6 </head>
 7 <body>
 8 {#<form action="{% url 'blog:edit_action' %}", method="post">#}
 9 {#    {% csrf_token %}#}
10 {#    {% if article %}#}
11 {#        <input type="hidden" name="article_id" value="{{ article.id }}">#}
12 {#        <label>文章标题#}
13 {#            <input type="text" name="title" value="{{ article.title }}">#}
14 {#        </label>#}
15 {#        <br/>#}
16 {#        <label>文章内容#}
17 {#            <input type="text" name="content" value="{{ article.content }}">#}
18 {#        </label>#}
19 {#        <br/>#}
20 {#    {% else %}#}
21 {#         <input type="hidden" name="article_id" value="0">#}
22 {#        <label>文章标题#}
23 {#            <input type="text" name="title" >#}
24 {#        </label>#}
25 {#        <br/>#}
26 {#        <label>文章内容#}
27 {#            <input type="text" name="content">#}
28 {#        </label>#}
29 {#        <br/>#}
30 {#    {% endif %}#}
31 {#    <input type="submit">#}
32 {#</form>#}
33 
34 <form action="{% url 'blog:edit_action' %}" method="POST">
35     {% csrf_token %}
36     <input type="hidden" name="article_id" value="{{ article.id | default:'0'}}">
37     <label>文章标题
38         <input type="text" name="title" value="{{ article.title }}"/>
39     </label>
40     <br/>
41     <label>文章内容
42         <input type="text" name="content" value="{{ article.content }}"/>
43     </label>
44     <br/>
45     <input type="submit">
46 
47 
48 </body>
49 </html>
    • 文章展示:article_page

      显示文章的内容,并有一个修改文章的入口

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Article Page</title>
</head>
<body>
<h1>{{ article.title }}</h1>
<br/>
<h3>{{ article.content }}</h3>
<br/>
<a href="{% url 'blog:edit_page' article.id %}">修改文章</a>

</body>
</html>

 

10、后端代码在views.py模块中实现

  views.py代码

 1 from django.shortcuts import render
 2 from django.http import HttpResponse
 3 # Create your views here.
 4 
 5 from . import models
 6 def index(request):
 7     #return HttpResponse('Hello, world!')
 8     articles = models.Article.objects.all()
 9     return render(request, 'blog/index.html', {'articles': articles})
10 
11 def article_page(request, article_id):
12     article = models.Article.objects.get(pk=article_id)
13     return render(request, 'blog/article_page.html', {'article':article})
14 
15 def edit_page(request, article_id):
16     if str(article_id) == '0':
17         return render(request, 'blog/edit_page.html')
18     article = models.Article.objects.get(pk=article_id)
19     return render(request,'blog/edit_page.html', {'article':article})
20 
21 def edit_action(request):
22     title = request.POST.get('title', 'TITLE')
23     content = request.POST.get('content', 'CONTENT')
24     article_id = request.POST.get('article_id', '0')
25     if article_id == '0':
26         models.Article.objects.create(title=title, content=content)
27         articles = models.Article.objects.all()
28         return render(request, 'blog/index.html', {'articles':articles})
29     article = models.Article.objects.get(pk=article_id)
30     article.title = title
31     article.content = content
32     article.save()
33     return render(request, 'blog/article_page.html',{'article':article})

 

11、url配置

  所有的HTML页面都要配置url才能在网页上访问,为了管理方便,可在应用中创建urls.py文件,该文件只对该应用有效 ,实现应用间的配置分离

  方法:在应用blog的目录下,创建python文件,命名为urls,代码如下

#存放URL子路径目录
from django.conf.urls import url

import blog.views as bv

app_name='[blog]'
urlpatterns = [
    url(r'^index/$', bv.index),
    url(r'^article/(?P<article_id>[0-9]+)$',bv.article_page,name='article_page'),
    url(r'^edit/(?P<article_id>[0-9]+)$', bv.edit_page, name='edit_page'),
    url(r'^edit/action$', bv.edit_action, name='edit_action'),
]

  当然,在项目根urls.py中做相应的配置才能识别到应用下的urls文件,代码如下:

 1 """TodoBlog URL Configuration
 2 
 3 The `urlpatterns` list routes URLs to views. For more information please see:
 4     https://docs.djangoproject.com/en/2.0/topics/http/urls/
 5 Examples:
 6 Function views
 7     1. Add an import:  from my_app import views
 8     2. Add a URL to urlpatterns:  path('', views.home, name='home')
 9 Class-based views
10     1. Add an import:  from other_app.views import Home
11     2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
12 Including another URLconf
13     1. Import the include() function: from django.urls import include, path
14     2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
15 """
16 from django.contrib import admin
17 from django.urls import path
18 from django.conf.urls import url, include
19 
20 urlpatterns = [
21     path('admin/', admin.site.urls),
22     url(r'blog/', include('blog.urls',namespace='blog')),
23 ]

 

12、访问网站

  主页地址:http://127.0.0.1:8000/blog/index/

       新文章地址:http://127.0.0.1:8000/blog/edit/0

  查看第一篇文章地址:http://127.0.0.1:8000/blog/article/1

  修改第一篇文章的地址:http://127.0.0.1:8000/blog/edit/1

 

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄