第一章:简单的博客系统
目录
3. 创建model,自动导入到数据库表db.sqlite3中
3.2 将该数据类型migrate到数据库SQLite文件里
1. 创建project : mysite
django-admin startproject mysiteV1_1
python manage.py runserver可以查看http://127.0.0.1:8000/ 界面
2. 创建app : blog,添加app
2.1 创建app : blog
python manage.py startapp blog
2.2 添加app
setting.py: 将创建的app添加到setting.py中的INSTALLED_APPS字段中
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'blog',
]
mysite/setting.py:另外可以设置语言、设置时区、设置调试模式
语言:zh-hans表示 中文-汉语-简体S: Simplified 简体字
zh-hant表示 中文-汉语-繁体T: Tranditional 繁体字
时区:UTC :协调世界时
Asia/Shanghai:中国大陆与UTC的时差均为+8,也就是UTC+8
LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'Asia/Shanghai'
3. 创建数据模型类class,自动导入到数据库表db.sqlite3中
(方法 : 创建model类,迁移到数据库)
(本质:通过写python文件的方式,自动创建数据库表字段,不需要了解SQL语言)
3.1 创建模型数据类class
blog/model.py:创建类class,各字段
模型:字段属性类 字符字段: # TextField() 保存字符串长度是无限制的,通常用于保存较大文本 # CharField(max_length=300) 保存字符串,使用时一定要声明字符串的长度 参数“max_length” 例:phone = models.CharField(max_length=20, blank=True, null=True) null是针对数据库而言,如果null = True, 表示数据库的该字段可以为空。 blank是针对表单的,如果blank = True,表示你的表单填写该字段的时候可以不填 时间字段: # DataTimeField() 包括Date日期和Time时间 常用参数“auto_now_add” DateField() 只有Date日期没有Time时间 关系字段:一对一OneToOneField、一对多ForeignKey、多对多ManyToMany # 一对多 例:author = models.ForeignKey(User, related_name="blog_posts") 一个User可以对应多篇文章作者 即一个User可以用好多遍 # 一对一 例:user = models.OneToOneField(User, unique=True) 一个User只能设置一遍用户信息
class BlogArticles(models.Model):
title = models.CharField(max_length=300)
author = models.ForeignKey(User, related_name="blog_posts")
# related_name="blog_posts"作用是允许User反向查询到BlogArticles
body = models.TextField()
publish = models.DateTimeField(default=timezone.now)
class Meta:
ordering = ("-publish",)
def __str__(self):
return self.title
3.2 将该数据类型migrate到数据库SQLite文件里
可以在SQL等数据库中创建与models.py代码对应的表,不需要自己手动执行SQL。
根据 数据模型models.py 自动建立 数据库表db.sqlite3
python manage.py makemigrations # 根据model.py自动生成0001_initial.py生成migration类
python manage.py migrate # 将生成的py文件真正应用到数据库
3.3 在admin界面中增删改查数据库:
法1:通过django自带的admin工具实现app数据库增删改查
3.3.1 创建超级管理员Donett
python manage.py createsuperuser
3.3.2 在admin.py增加数据库模型
admin.site.register(BlogArticles)
3.3.3 启动网页服务即可增删改查
python manage.py runserver就可以在http://127.0.0.1:8000/admin/ 超级用户界面增删改查博客文章
4. MTV模式,开发app的html页面
输入域名
urls正则表达式比对该域名是否有对应哪个views视图函数
views视图函数里,说明了用html模板文件展示,需要传入什么键值对数据
model.py 创建数据库的字段
admin.py import该类到当前环境中,将该类注册到admin中
templates 存放html模板文件:模板文件,继承文件
views.py 决定使用哪个html模板,向该模板渲染什么数据
urls.py 获取urls链接中的数据,传给参数
就可以在http://127.0.0.1:8000/blog/ 界面,增删改查博客文章
就可以在http://127.0.0.1:8000/blog/1 界面,增删改查博客文章
model.py
from django.db import models
from django.contrib.auth.models import User
from django.utils import timezone
class BlogArticles(models.Model):
title = models.CharField(max_length=300)
author = models.ForeignKey(User, related_name="blog_posts")
body = models.TextField()
publish = models.DateTimeField(default=timezone.now)
class Meta:
ordering = ("-publish",)
def __str__(self):
return self.title
admin.py
from .models import BlogArticles
admin.site.register(BlogArticles)
templates文件夹
title.html:
模板语法:由views视图函数 传入html模板 进行渲染的键值对参数,需要用 块标签 变量标签的语法
- 块标签{}
{% for this in blogs %}
{% endfor %}
{% if condition%}
{% else %}
{% endif %}
- 变量标签
{{ this.titile }}
{{ article.body }}
views.py
决定使用哪个html模板,向该模板渲染什么数据
例:
value = BlogArticles.objects.all()
render(request, "titles.html", {"blogs":value})
即:使用titles.html模板,渲染blogs这个数据
参数1:html文件
参数2:contexts键值对 {“键”:值, “键”:值, }
键:在html中要使用的变量
值:视图函数view中确定的值
def blog_title(request):
blogs = BlogArticles.objects.all()
return render(request, "titles.html", {"blogs":blogs})
def blog_content(request, article_id):
article = BlogArticles.objects.get(id=article_id)
return render(request, "content.html", {"article": article, "publish": article.publish})
urls.py
urlpatterns = [
url(r'^$', views.blog_title, name="blog_title" ),
url(r'(?P<article_id>\d)/$', views.blog_content, name="blog_detail")
]