环境安装和配置
pip install virtualenv -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install virtualenvwrapper-win
mkvirtualenv web #创建虚拟环境
workon web #切换到虚拟机环境
pip install django==2.2.7
#settings.py
ALLOWED_HOSTS = ['*']
LANGUAGE_CODE = 'zh-hans'
#TIME_ZONE = 'UTC'
USE_TZ = False
应用环境配置
创建应用
>cd <项目目录>
>python manage.py startapp blog
-
migrations
迁移文件集合
admin.py:项目的后台
apps.py:应用设置
models.py:模型(数据库)
views.py:视图(页面请求和响应)
注册应用
- 修改settings.py
INSTALLED_APPS = [
...
'blog.apps.BlogConfig'
]
数据库配置
启动mysql服务
-
[shuyun@master ~]$ sudo service mysqld start Starting mysqld: [ OK ]
- 数据库连接参数:
- 用户: root
- 密码:123456
- 端口:3306
- 数据库连接参数:
确认虚拟机IP
[shuyun@master ~]$ ifconfig
eth5 Link encap:Ethernet HWaddr 00:50:56:3A:1F:12
inet addr:192.168.89.200 Bcast:192.168.89.255 Mask:255.255.255.0
-
settings.py完成mysql配置
-
开发环境
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), } }
生产环境
-
DATABASES = {
'default':{
'ENGINE':'django.db.backends.mysql',
'NAME':'blog',
'USER':'root',
'PASSWORD':'123456',
'HOST':'192.168.89.200',
'PORT':3306,
}
}
安装pymysql
pip install PyMySQL
修改blogproj/init.py
import pymysql
pymysql.install_as_MySQLdb()
创建数据库和授权
[root@master ~]# mysql -uroot -p123456
mysql> create database blog;
mysql> grant all on blog.* to root@'%' identified by '123456';
创建管理员账号
用户:admin,密码:admin
python manage.py createsuperuser
数据模型
在models.py中完成如下配置
博客模型
from django.db import models
from django.contrib.auth.models import User
#文章类别
class Category(models.Model):
#默认自动生成id字段作为主键
name = models.CharField(verbose_name='名称', max_length=100)
#标签
class Tag(models.Model):
#默认自动生成id字段作为主键
name = models.CharField(verbose_name='名称', max_length=100)
class Post(models.Model):
title = models.CharField(verbose_name='标题', max_length=100)
body = models.TextField(verbose_name='正文') #TextField存储大段文本
create_time = models.DateTimeField(verbose_name='创建时间')
modified_time = models.DateTimeField(verbose_name='修改时间')
excerpt = models.CharField(verbose_name='摘要',max_length=255)
category = models.ForeignKey(Category, on_delete=models.CASCADE,verbose_name='类别') #一对多
tags = models.ManyToManyField(Tag, blank=True,verbose_name='标签') #多对多
author = models.ForeignKey(User,on_delete=models.CASCADE,verbose_name='用户')
数据库迁移
python manage.py makemigrations #创建迁移文件
python manage.py migrate #迁移到数据库
ORM操作
存数据
>python manage.py shell
In [1]: from blog.models import Category,Tag,Post
#写入类别
In [2]: cate = Category(name='test cate1')
In [3]: cate.save()
#写入标签
In [4]: tag = Tag(name='test tag1')
In [5]: tag.save()
#写入博客
In [2]: from django.contrib.auth.models import User
In [8]: from django.utils import timezone
In [4]: user = User.objects.get(username='admin')
In [7]: post = Post(title='title_test1',body='body_test1',create_time=timezone.now(),modified_time=timezone.now(),category=cate,author=user)
post.save()
读数据
#读取category
In [18]: cateall = Category.objects.all()
In [19]: cateall
Out[19]: <QuerySet [<Category: Category object (1)>, <Category: Category object (2)>]>
In [20]: cateall[0]
Out[20]: <Category: Category object (1)>
In [21]: cateall[0].name
Out[21]: 'test cate1'
#TODO练习:读取post的body数据
In [22]: post = Post.objects.all()
In [23]: post[0].body
Out[23]: 'body_test1'
删数据
#删类别
In [24]: cate1 = Category.objects.get(name='test cate1')
In [26]: cate1.delete()
Out[26]: (1, {'blog.Category': 1})
#TODO练习:删除post数据
In [27]: post = Post.objects.get(id=1)
In [28]: post.delete()
Out[28]: (1, {'blog.Post_tags': 0, 'blog.Post': 1})
视图
视图函数
-
修改了blog/views.py
from django.http import HttpResponse def index(request): return HttpResponse("欢迎学习Django!")
URL绑定
-
配置项目URL:blogproj/urls.py
.... from django.conf.urls import url,include urlpatterns = [ ... url(r'',include('blog.urls')) ]
-
在blog项目目录下创建urls.py文件
-
添加代码
from django.conf.urls import url,include from . import views urlpatterns = [ url(r'', views.index, name='index') ]
-
-
启动开发服务
python manage.py runserver #默认8000端口 #Starting development server at http://127.0.0.1:8000/ python manage.py runserver 127.0.0.1:8001 #指定端口启动
浏览器访问
模板系统
模板指静态页面(html)
静态文件:css、js
-
创建templates/blog目录,新建index.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>{{ title }}</title> </head> <body> <h1>{{ welcome }}</h1> </body> </html>
{{ title }},{{ welcome }}:模板变量
- 修改views.py
def index(request):
context = {'title':"Dylan的Blog", 'welcome':'欢迎来到我的博客'}
return render(request, 'blog/index.html', context=context)
-
刷新页面
博客首页
静态文件
- 拷贝模板
- 项目目录下创建static/blog目录
- 拷贝css和js到上述目录
- 拷贝index.html到templates/blog目录
- 修改settings
STATIC_ROOT = os.path.join(BASE_DIR,'static') #新增
- 修改index.html
{% load static %}
...
<!-- css -->
<link rel="stylesheet" href="{% static 'blog/css/bootstrap.min.css' %}">
<link rel="stylesheet" href="http://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css">
<link rel="stylesheet" href="{% static 'blog/css/pace.css' %}">
<link rel="stylesheet" href="{% static 'blog/css/custom.css' %}">
<!-- js -->
<script src="{% static 'blog/js/jquery-2.1.3.min.js' %}"></script>
<script src="{% static 'blog/js/bootstrap.min.js' %}"></script>
<script src="{% static 'blog/js/pace.min.js' %}"></script>
<script src="{% static 'blog/js/modernizr.custom.js' %}"></script>
</head>
...
<script src="{% static 'blog/js/script.js' %}"></script>
</body>
...