1 创建应用
1.1 cmd在项目目录下创建博客APP
python manage.py startapp blog
2.2 把博客APP添加到项目的settings的app列表下,在大约四十行里添加自己的app名称。
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
#自定义的app
'helloworld'
'blog',
]
- app计划页面
(1)主页,显示所有的博客标题,可以点击某个标题来查看内容。
(2)点击后显示详细的内容
(3)新建文章或者修改文章都会跳到一个表单的区域,
2 创建数据模型
2.1 分析这个APP依赖的数据
(1)博客标题,最大长度不超过30个字符,默认是title。
(2)博客内容,不能为空。
2.2. 在blog/models.py下创建一个模型类,表示数据库里的一张表。
具体的字段各个属性可以在官方网站上看到,默认用的是自带的sqlite数据库。
(1)代码部分
class Article(models.Model):
# 创建文章数据表
title=models.CharField(max_length=32,default="Title")
content=models.TextField(null=True)
(2)分析:
<1>这个类对应着一张名字叫做blog_article的数据表。(默认是app名称_类名称小写创建表名)
<2>每个静态属性表示表的属性。
<3>这个类的实例表示数据表中的一条数据,也就是一个数据元素。实例的属性表示一个数据项。实例的属性与表的属性同名。
(3)数据迁移,把这个这个模型类的信息自动转化为SQL传入到数据库里
python manage.py makemigrations
python manage.py migrate
2.3 通过pycharm的自带的可视化工具可以查看数据库里已经有了一张表。
(1)安装pycharm的DB browser插件。创建一个连接。
(2)查看数据库可以发现有了刚才创建的数据表blog_article,还有一些数据库用来管理Django的用户和一些日志信息。默认创建了叫做id的主键,从1开始的增长。
2.4 在管理员的角度看这些数据
(1)创建管理员,按照要求填写信息。
python manage.py createsuperuser
(2)使得这张数据表对于管理员可见,在blog/admin里把数据表注册显示到管理页面上。
from .models import Article
# Register your models here.
admin.site.register(Article)
(3)登陆管理员账户查看数据
2.5 创建一些文章并且查看
(1)管理页面上创建两篇文章,成功
(2)在DB Browser插件上sql语句查看数据表。
(3)注意对数据库的操作只能有一个连接,也就是说admin操作数据时必须断开可视化工具对数据库的连接。
2.6 优化数据表对于管理员的显示
(1)admin现在看Article根本不知道哪个的标题是哪一个,他只是根据创建文章的先后排列的。因此我们可以设置一些东西可以让管理员更加舒服。
(2)
3. 数据显示
3.1 配置URL
(1) 一级url配置,项目urls.py里。表示blog/后面再添加东西到blog.urls这个模块里找
from django.contrib import admin
from django.urls import path,include
urlpatterns = [
path('admin/', admin.site.urls),
path('blog/', include('blog.urls')),
]
(2)二级url配置,app的urls.py里,需要自己新建一个blog下的urls.py。
from django.urls import path,re_path
from . import views
urlpatterns = [
# 主页面
path("index/",views.index),
# 每个博客的详细页面
re_path("(?P<article_id>[0-9]+)",views.detail),
]
(3)注意两种url定义的方式
<1>path函数,第一个参数接受字符串,这个字符串通常以/结尾,第二个参数表示用来渲染页面的函数。
<2>re_path函数,与path不同的就是第一个参数,可以使用正则表达式。并且(?P<变量名>正则表达式)会把括号里的正则表达式匹配的字符串子串当作参数传入到渲染页面函数里。
3.2 视图函数
(1)blog/views.py视图渲染函数。
<1>第一个函数渲染的是主页,只接受HTTP请求即可。
<2>第二个函数渲染的是博客内容的详细页面,需要接受HTTP请求,同时接受文章的编号。这个编号从1开始自然数增加。
from django.shortcuts import render
from .models import Article
# Create your views here.
def index(reqeust):
articles=Article.objects.all()
return render(reqeust,'blog/index.html',{"articles":articles})
def detail(request,article_id):
article = Article.objects.get(pk=article_id)
return render(request, "blog/detail.html", {"article": article})
(2)render函数
对页面进行渲染,第一个参数表示http请求,第二个参数表示DTL文件,第三个参数表示传入的数据,以字典形式传入。
(3)models里数据的获取。
通过objects这个静态属性获取,相当于对数据表的管理器,对他调用一些方法相当于对于这个表执行SQL语句。
<1>all()获得所有的数据,返回一个序列,序列的元素表示一条数据元素,是一个对象。
<2>get(pk=)获得主键是特定值的数据,返回一条数据元素,是一个对象。
3.3 模板
(1)DTL,由HTML与Django组合而成的一种模板语言,本质上还是html,其中融入了一些python语法使得可以进行变量处理和使用逻辑判断,实现了一个html文件传入不同的参数会有不同的效果
(2)在blog下新建一个templates/blog文件夹。创建两个DTL文件,用于展示主页数据和详细页面的数据。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>主页</h1>
{% for article in articles %}
<a href="" style="font-size:36px">{{ article.title }}</a>
<br/>
{% endfor %}
<a href="">新建文章</a>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>{{ article.title }}</h1>
<p>{{ article.content }}</p>
<a href=""}>修改文章</a>
</body>
</html>
(3)DTL语句
<1>显示变量内容
{{ 变量名 }}
<2>循环遍历序列中的内容。
{% for i in 序列 %}
语句
{% endfor %}