Django Blog - 01. 基本应用搭建

初始环境搭建

创建虚拟环境 & 安装 Django

1
2
3
4
mkdir blog
cd blog
python3 -m venv venv
pip install django

创建 Django Blog 项目

1
django-admin startproject blog_prj .

运行该项目

1
python manage.py runserver

运行项目后,会在控制台有如下输出内容:
upload successful

浏览器打开链接http://127.0.0.1:8000/后,如下图所示:
upload successful

创建新的应用 blog

1
python manage.py startapp blog

执行数据库迁移操作

1
python manage.py migrate

修改settings.py文件,增加新的应用blog

1
2
3
4
5
6
7
8
9
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'blog',
]

数据库模型

修改blog/models.py文件,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
from django.db import models

class Post(models.Model):
title = models.CharField(max_length=140)
author = models.ForeignKey(
'auth.User',
on_delete=models.CASCADE,
)
body = models.TextField()

def __str__(self):
"""The representation string of the model"""
return self.title

执行数据库迁移:

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

Django Admin

新建管理员账号:
upload successful

执行python manage.py runserver再次运行 Django 服务,并在浏览器中打开 http://127.0.0.1:8000/admin/,登入管理员账号后会看到下图:
upload successful

添加 Post 模型

修改blog/admin.py文件,代码如下:

1
2
3
4
from django.contrib import admin
from .models import Post

admin.site.register(Post)

刷新网页后,看到更新如下:
upload successful

随意增加两条样本数据,刷新页面如下:
upload successful

Views

编辑blog/views.py文件,代码如下:

1
2
3
4
5
6
from django.views.generic import ListView
from .models import Post

class BlogListView(ListView):
model = Post
template_name = 'home.html'

Templates

在项目根目录中创建templates目录,并在该目录中创建base.htmlhome.html文件:
upload successful

更新settings.py文件,让 Django 知道到哪里找templates目录,代码如下:

1
2
3
4
5
6
7
TEMPLATES = [
{
...
'DIRS': [os.path.join(BASE_DIR, 'templates')],
...
},
]

编辑base.html文件,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<html>
<head>
<title>Django blog</title>
</head>
<body>
<header>
<h1><a href="/">Django blog</a></h1>
</header>
<div class="container">
{% block content %}
{% endblock content %}
</div>
</body>
</html>

编辑home.html文件,代码如下:

1
2
3
4
5
6
7
8
9
10
{% extends 'base.html' %}

{% block content %}
{% for post in object_list %}
<div class="post-entry">
<h2><a href="">{{ post.title }}</a></h2>
<p>{{ post.body }}</p>
</div>
{% endfor %}
{% endblock content %}

URLs

新建blog/urls.py文件,代码如下:

1
2
3
4
5
6
7
from django.urls import path

from . import views

urlpatterns = [
path('', views.BlogListView.as_view(), name='home')
]

更新项目的urls.py文件,代码如下:

1
2
3
4
5
6
7
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
path('admin/', admin.site.urls),
path('', include('blog.urls')),
]

再次运行程序,刷新页面http://127.0.0.1:8000/ ,显示如下:

upload successful

静态文件

在项目根目录中创建static目录:
upload successful

更新settings.py文件,让 Django 知道到哪里找static目录,代码如下:

1
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')]

static目录中创建css目录,并在css目录中创建base.css文件:

upload successful

编辑base.css文件,代码如下:

1
2
3
header h1 a {
color: red;
}

最后,在base.html模板文件的最上方增加的那行 load static 代码的作用是可以让模板关联到静态文件的目录。另外,通过<link>标签来明确地引入base.css文件,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
{% load static %}
<html>
<head>
<title>Django blog</title>
<link rel="stylesheet" href="{% static 'css/base.css' %}">
</head>
<body>
<header>
<h1><a href="/">Django blog</a></h1>
</header>
<div class="container">
{% block content %}
{% endblock content %}
</div>
</body>
</html>

再次运行程序,刷新页面http://127.0.0.1:8000/ ,样式已经生效,如下所示:

upload successful