以创建图书管理项目为例子:
蓝色
为自定义名称;
红色
为内置命令
1.进入虚拟环境
2.创建项目
2.1创建项目目录
- cd Desktop/
- mkdir pytest
- cd pytest
2.2创建项目
- django-admin startproject test1(项目名称)
2.2.1查看项目结构
2.3创建应用(路径在Deskto/pytest/test1/)
- python manage.py startapp booktest(应用名)
3.用pycharm配置文件
3.1修改settings.py(路径在test1/settings.py)
3.1.1新增应用
3.1.2本地化
- LANGUAGE_CODE = 'zh-hans' #使用中国语言
- TIME_ZONE = 'Asia/Shanghai' #使用中国上海时间
3.1.3启动项目
- python manage.py runserver #轻量级服务器,用于测试阶段
3.2可配置sql数据库的连接
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'test1', #数据库名字,
'USER': 'root', #数据库登录用户名
'PASSWORD': 'mysql', #数据库登录密码
'HOST': 'localhost', #数据库所在主机
'PORT': '3306', #数据库端口
}
}
import pymysql
pymysql.install_as_MySQLdb()
4.创建模型
4.1在booktest里的models.py里定义模型的属性
4.1.1字段类型
django.db里的models
包,字段类型如下:
类型 |
描述 |
AutoField |
自动增长的IntegerField,通常不用指定,不指定时Django会自动创建属性名为id的自动增长属性。
|
BooleanField |
布尔字段,值为True或False。
|
NullBooleanField |
支持Null、True、False三种值。
|
CharField(max_length=最大长度)
|
字符串。参数max_length表示最大字符个数。
|
TextField |
大文本字段,一般超过4000个字符时使用。
|
IntegerField |
整数 |
DecimalField(max_digits=None, decimal_places=None)
|
十进制浮点数。参数max_digits表示总位。参数decimal_places表示小数位数。
|
FloatField |
浮点数。参数同上 |
DateField:([auto_now=False, auto_now_add=False])
|
日期。
1)参数auto_now表示每次保存对象时,自动设置该字段为当前时间,用于"最后一次修改"的时间戳,它总是使用当前日期,默认为false。
2) 参数auto_now_add表示当对象第一次被创建时自动设置当前时间,用于创建的时间戳,它总是使用当前日期,默认为false。
3)参数auto_now_add和auto_now是相互排斥的,组合将会发生错误。
|
TimeField |
时间,参数同DateField。
|
DateTimeField |
日期时间,参数同DateField。
|
FileField |
上传文件字段。 |
ImageField |
继承于FileField,对上传的内容进行校验,确保是有效的图片。
|
4.1.2选项
通过选项实现对字段的约束,选项如下:
选项名 |
描述 |
default |
默认值。设置默认值。 |
primary_key |
若为True,则该字段会成为模型的主键字段,默认值是False,一般作为AutoField的选项使用。
|
unique |
如果为True, 这个字段在表中必须有唯一值,默认值是False。
|
db_index |
若值为True, 则在表中会为此字段创建索引,默认值是False。
|
db_column |
字段的名称,如果未指定,则使用属性的名称。 |
null |
如果为True,表示允许为空,默认值是False。
|
blank |
如果为True,则该字段允许为空白,默认值是False。
|
4.1.3定义模型BookInfo;HeroInfo
#定义图书模型类BookInfo
class BookInfo(models.Model):
btitle = models.CharField(max_length=20)#图书名称
bpub_date = models.DateField()#发布日期
bread = models.IntegerField(default=0)#阅读量
bcomment = models.IntegerField(default=0)#评论量
isDelete = models.BooleanField(default=False)#逻辑删除
#定义英雄模型类HeroInfo
class HeroInfo(models.Model):
hname = models.CharField(max_length=20)#英雄姓名
hgender = models.BooleanField(default=True)#英雄性别
isDelete = models.BooleanField(default=False)#逻辑删除
hcomment = models.CharField(max_length=200)#英雄描述信息
hbook = models.ForeignKey('BookInfo')#英雄与图书表的关系为一对多,所以属性定义在英雄模型类中
- 可在个项类中配置魔法属性(返回相应的属性名称替代返回的object)
def __str__(self):
return self.XXX(自定义模型内属性名称如:btitle,hname)
4.2生成迁移文件
- python manage.py makemigrations
- python manage.py migrate
4.2.1可进入交互模式shell(
增,删,改,查
)
- python manage.py shell
- from booktest.models import BookInfo,HeroInfo(从模块导入项目)
- from datetime import date
- 增
b = BookInfo()
#
定义一个
BookInfo
类的对象
b.btitle ='
天龙八部
' #
定义
b
对象的属性并赋值
b.bpub_date = date(1990,10,11)
b.save()
#
才会将数据保存进数据库
b.delete()
b1 = BookInfo.objects.get(id=1)
b1.btilte = ‘XXX’
b1.bpub_date = date(XXXX,XX,XX)
b1.save()
使用下面的命令可以实时查看
mysql
的日志文件
:
sudo tail -f /usr/local/mysql/data/
Floral
deMacBook-Pro.log
通过
模型类
.objects
属性可以调用如下函数,实现对模型类对应的数据表的查询。
函数名 |
功能 |
返回值 |
说明 |
get |
返回表中满足条件的一条且只能有一条数据。
|
返回值是一个模型类对象。 |
参数中写查询条件。
2)查询不到数据,则抛异常:DoesNotExist。
|
all |
返回模型类对应表格中的所有数据。 |
返回值是QuerySet类型
|
查询集 |
filter |
返回满足条件的数据。 |
返回值是QuerySet类型
|
参数写查询条件。 |
exclude |
返回不满足条件的数据。 |
返回值是QuerySet类型
|
参数写查询条件。 |
order_by |
对查询结果进行排序。 |
返回值是QuerySet类型
|
参数中写根据哪些字段进行排序。 |
5.配置URL
5.1修改test1里的urls.py文件
- urlpatterns=[url(r'^',include('booktest.urls’)),]#include、url函数从django.conf.urls模块导入
5.2在booktest里新建urls.py文件
- from django.conf.urls import url
- from booktest import views#导入booktest里的views.py视图模块文件
urlpatterns=[url(r’^index$’,views.index),#匹配视图文件里的主页index函数,
注意正则匹配
url(r’^delete
(\d+)
$’,views.delete),]#匹配视图文件里的定义的delete函数
5.3在booktest里的views.py文件里定义相关函数
- from django.shortcuts import render, redirect(重定向)
- from booktest.models import *
- from datetime import date
- #from django.http import HttpResponse,HttpResponseRedirect(重定向)
def
index
(request):
books = BookInfo.objects.all()
#return
HttpResponse(‘XXXX’)
return
render(request
,
'booktest/index.html'
,
{
'books'
: books})#后面需配置index.html文件
def
delete
(request
,
bid):#bid为5.2中网页进行正则匹配时传递的参数
(\d+)
book = BookInfo.objects.get(
id
=bid)
book.delete()
#return HttpResponseRedirect
(
’/
index’)
return
redirect(
‘/
index
‘
)#此处的重定向地址’/index’要与booktest里的urls.py正则匹配要对上
6.建立网页模版文件
6.1创建模版文件
- 在test1目录下创建templates/booktest文件夹
- 在booktest文件夹里创建模版文件index.html
6.2配置test1目录下的settings.py文件
TEMPLATES = [
{
'BACKEND'
:
'django.template.backends.django.DjangoTemplates'
,
'DIRS'
: [
os.path.join(BASE_DIR
,
'
templates
'
)
]
,
…
…
}
STATIC_URL =
'/static/'
STATICFILES_DIRS = [os.path.join(BASE_DIR
,
'static
’
)
]
# 富文本编辑器配置
TINYMCE_DEFAULT_CONFIG = {
'theme'
:
'advance'
,
'width'
:
600
,
'height'
:
400
,
}
# 发送邮件配置
EMAIL_BACKEND =
'django.core.mail.backends.smtp.EmailBackend'
# smpt服务地址
EMAIL_HOST =
' smtp.163.com
'
EMAIL_PORT =
25
# 发送邮件的邮箱
# 在邮箱中设置的客户端授权密码
EMAIL_HOST_PASSWORD =
'smartli123'
# 收件人看到的发件人
# Django的缓存配置
CACHES = {
"default"
: {
"BACKEND"
:
"django_redis.cache.RedisCache"
,
"LOCATION"
:
" redis://172.16.179.130:6379/9
"
,
"OPTIONS"
: {
"CLIENT_CLASS"
:
"django_redis.client.DefaultClient"
,
}
}
}
# 配置session存储
SESSION_ENGINE =
"django.contrib.sessions.backends.cache"
SESSION_CACHE_ALIAS =
"default"
6.3设计网页模版内容(根据需求)
html>
lang="en">
charset="UTF-8">
图书列表
图书列表
{% for book in books %}#views下的index函数中定义的books可通过{'books': books}传递给指定的html文件
{% endfor %}
- 模板变量使用:{{ 模板变量名 }}
- 模板代码段:{%代码段%}
- for循环:
{% for i in list %}#
list
不为空时执行的逻辑
{% empty %}#
list
为空时执行的逻辑
{% endfor %}#for循环结束