认识数据库
- 存储数据的仓库
- 什么是数据?
- 学生的姓名、性别、成绩;
- 用户的银行卡号、密码、余额、交易记录
- 网站的登录账号、密码、评论
- 游戏的用户名、装备、属性、等级
数据是如何存在数据库中
一张张表存储各种信息
-
表与表之间还可能有不同的联系
Django中的数据库
打开blog应用里的models.py文件
-
加入以下内容
#继承于models.Model, 新建了叫post的表格 class Post(models.Model): # 有title属性 title=modesl.CharField(max_length=80)
-
同步数据库
- 根目录运行
python manage.py makemigrations
-
得到如下提示,表示创建了Post模型
- 继续命令运行
python manage.py migrate
-
得到如下提示
- 根目录运行
利用admin后台系统管理数据
运行
python manage.py runserver
启动服务器-
修改blog文件夹中的admin.py
from django.contrib import admin from .models import Post # Register your models here. admin.site.register(Post)
-
登录admin后台系统
-
访问
http://127.0.0.1:8000/admin
,会看到新增了一个栏目
-
-
admin后台系统管理
点击Posts进入,可以看见还没有内容发布过
-
点击ADD POST,可直接添加一个Post的title
在title中输入内容,SAVE保存,保存后叫Post project(1),不直观
-
修改blog文件夹里的models.py
class Post(models.Model): # 有title属性 title=models.CharField(max_length=80) def __str__(self): return self.title
此时,这里就展示的是你输入的title的内容
设计博文模型
-
一篇博客相关的信息如下:
- 标题
- 副标题
- 作者
- 发表日期
- 标签
- 分类
- 博文内容
- 博文链接
- 点赞数(可选)
- 阅读量(可选)
-
Django中可用的各类模型
目前常用:
- CharField 简单文字模型
- DateTiemField 时间模型
- TextField 大段文字模型 -
设计博文模型简易版
这样设计存在什么问题?
作者、标签、分类存在同一个表中,会造成大量重复的内容、不易检索、不易修改。
-
设计博文模型进阶版
博文基础模版
-
models.py
添加一些基础模型class Post(models.Model): title=models.CharField(max_length=80) subtitle=CharField(max_length=120) publish_date=models.DateTimeField() content=models.TextField() link=models.CharField(max_length=200) def __str__(self): return self.title
-
关联作者模型
from django.db import models from django.contrib.auth.models import User` class Post(models.Model): title=models.CharField(max_length=80) subtitle=CharField(max_length=120) publish_date=models.DateTimeField() content=models.TextField() link=models.CharField(max_length=200) # 利用ForeignKey()即把字段author关联另外一个模型 author=models.ForeignKey(User,on_delete=models.CASCADE) def __str__(self): return self.title
新建分类模型和标签模型
添加两个class,同时补充Post类
class Category(models.Model):
"""分类"""
name = models.CharField(max_length=100)
def __str__(self):
return self.name
class Tag(models.Model):
"""标签"""
name = models.CharField(max_length=100)
def __str__(self):
return self.name
class Post(models.Model):
title=models.CharField(max_length=80)
subtitle=models.CharField(max_length=120)
publish_date=models.DateTimeField()
content=models.TextField()
link=models.CharField(max_length=200)
# 利用ForeignKey()即可关联另外一个模型
author=models.ForeignKey(User,on_delete=models.CASCADE)
category=models.ForeignKey(Category,on_delete=models.CASCADE)
# 利用MangToManyField()关联另外一个模型
tag=models.ManyToManyField(Tag,blank=True)
def __str__(self):
return self.title
-
ForeignKey()和ManyToManyField()的区别
-
一对多的关系,使用ForeignKey()
一篇文章只有一个分类,一个分类下有多个文章
-
多对多的关系,使用MangToManyField()
一个文章可以有多个标签,一个标签会对应多个文章
-
-
新建了2个模型,所以要在admin.py中添加
from django.contrib import admin from .models import Post from .models import Category from .models import Tag # Register your models here. admin.site.register(Category) admin.site.register(Tag) admin.site.register(Post)
运行Django的管理命令
-
只要修改了
models.py
文件,都需要运行python manage.py makemigrations
会提示:
意思为:
选择1方案,填写默认值1,除了时datetime填timezone.now
创建成功:
每次运行完
python manage.py makemigrations
,都要运行python manage.py magrate
注意:如果这里运行
python manage.py magrate
时一直报错,难以结局,可以尝试删掉my_blog
下的db.sqlite3
文件,再重新运行python manage.py magrate
,再重新创建admin账号即可。
admin后台查看
-
进入到后台管理,可以看到新增了Category、Tag
-
点击Posts-Add post,新增了我们写的字段
添加Category,比如添加
编程
分类
![image](https://upload-images.jianshu.io/upload_images/12041448-3c7cf803756c4e3d?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
-
添加Tag,比如添加
Python
标签 -
再进入到post,可以发现Category可选编程,Tag可以选Python,直接点击
➕
添加也可
从数据库提取真正的博文信息
- 修改
views.py
引入Post模型
from .models import Post
列出全部的Post数据,按发表日期倒序排列
Post.objects.all().order_by('-publish_date')
-
修改如下:
from django.shortcuts import render from django.http import HttpResponse from .models import Post # Create your views here. def index(request): post_list=Post.objects.all().order_by('-publish_date') return render(request,'blog/index.html',{'post_list':post_list})
设计博客详情页网址
每篇博文有一个英文的网址,如
127.0.0.1:8080/blog/django-course-1
后台link只需要填
django-course-1
部分-
修改index.html的博客详情页链接,设计为
blog/link
<a href="/blog/{{post.link}}">
-
将时间那里改为我们的时间变量
<p class="post-meta">Posted by <a href="#">{{post.author}}</a> {{post.publish_date}}</p>
修改urls.py的网址配置,将blog_detail的参数改为blog_link
path('<int:blog_link>',views.blog_detail,name='blog_detail'),
-
修改views.py
from django.shortcuts import render,get_object_or_404
get_object_or_404表示从某个模型根据关键字提取某段数据,找不到返回数据,就返回404页面
def blog_detail(request,blog_link): post=get_object_or_404(Post,link=blog_link) return HttpResponse(post.content)
-
在管理后台配置一篇博客,看下效果
添加博客详情页模版
我们下载的模版中,有一个post.html的文件,就是我们博客详情页的模版,把它用到我们项目中,放在我们app的/templates/blog
下.
-
修改views.py
def blog_detail(request,blog_link): post=get_object_or_404(Post,link=blog_link) # 返回博文详情 return render(request,'blog/post.html',{'post':post})
-
修改post.html
同我们修改index.html一样,把js、css、img的路径进行修改:
<link href="{%static 'blog/vendor/bootstrap/css/bootstrap.min.css' %}" rel="stylesheet">
修改title、标题、副标题、作者、正文、时间:
![image](https://upload-images.jianshu.io/upload_images/12041448-80c6cf86d6389b21?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![image](https://upload-images.jianshu.io/upload_images/12041448-c1880a0405574a05?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![image](https://upload-images.jianshu.io/upload_images/12041448-e98dde80a216caf5?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
更漂亮的正文排版
方式一:在后台的content中直接写html代码,比较麻烦;
方式二:采用Markdown格式编写博文(推荐)
- 安装markdown模块
pip install markdown2
- 修改views.py
def blog_detail(request,blog_link): post=get_object_or_404(Post,link=blog_link) post.content = markdown2.markdown(post.content) # 返回博文详情 return render(request,'blog/post.html',{'post':post})
- 后台博客content中用markdown语法进行编辑
![image](https://upload-images.jianshu.io/upload_images/12041448-a186b0859874f986?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![image](https://upload-images.jianshu.io/upload_images/12041448-065707266d6d84c6?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
发现没有对标签进行渲染,如何解决?
在post.html中的`{{post.content}}`修改为`{{post.content|safe}}`
![image](https://upload-images.jianshu.io/upload_images/12041448-2662420cd0abf804?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![image](https://upload-images.jianshu.io/upload_images/12041448-6951cad5b72d5aec?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
**遗留问题,这里貌似不支持代码块的展示,待解决**
调整url
现在的url是127.0.0.1:8000/blog/
首页,我们希望127.0.0.1:8000
就是首页
- 修改my_blog的urls.py
urlpatterns = [ path('admin/', admin.site.urls), path('',include('blog.urls')), ]
- 修改blog的urls.py
urlpatterns = [ path('',views.index,name='blog_index'), path('blog/<slug:blog_link>/',views.blog_detail,name='blog_detail'), ]
如何把网站对外发布
- 购买服务器和域名
服务器见文章最前面部分
-
域名
- 国内:wanwang.aliyun.com
- 国外:godaddy.com
- .cn/.com等域名需要实名认证
服务器或者域名在国内买的,需要进行备案,没有备案的话,有可能会被墙掉
-
购买后,设置域名解析,表示该域名指向的服务器ip地址
Django部署
(不详细讲,自行google)
安装uwsgi
-
配置uwsgi.ini
示例:
安装nginx
配置nginx
启动uwsgi
uwsgi --ini uwsgi.ini
启动nginx
服务器使用中常见的几个问题
- 可能是数据库没有填写我们的hosts
- 80端口可能之前已经被打开,关掉80端口即可
- ip地址没填对,要公网的ip地址
- 连上一段时间没有操作也会自动断掉
- 网络连接问题
- 安装一个screen应用