一、Django入门
1.1基本概念
1.2创建环境与app项目
安装依赖包
pip install django==2.0.1 -i https://mirrors.ailiyun.com/pypi/simple
进入“终端”CMD命令,通过django-admin命令创建django项目
[django]命令
check
compilemessages
createcachetable
dbshell
diffsettings
dumpdata
flush
inspectdb
loaddata
makemessages
makemigrations
migrate
runserver
sendtestemail
shell
showmigrations
sqlflush
sqlmigrate
sqlsequencereset
squashmigrations
startapp
startproject
test
testserver
django-admin startproject helloDjango 创建一个helloDjango项目
通过django-admin命令创建app应用
django-admin startapp mainapp
在一个Django项目中,存在很多app应用(模块),创建好的app需要注册到主工程中(settings.py)
1.3django项目结构
项目结构如下:
helloDjango
|--helloDjango 主工程目录
|----setting.py #设置文件,数据库连接,app注册、中间件及模板配置
|----urls.py #总路由
|----wsgi.py #Django实现wsgi得脚本
|----__int__.py
|--mainapp 应用模块(主)
__int__.py
admin.py #后台管理配置脚本
models.py #数据模型类声明所在脚本
view.py #声明当前应用得视图处理函数或类
urls.py #自己增加得当前应用模块的子路由
tests.py #当前应用模块的单元测试类
apps.py #声明当前应用的基本信息
|--manage.py WEB应用的启动脚本,项目工程的入口
1.4django请求流程
#1.到urls分发器 (总urls.py 到子路由)
#2.urls分发器根据路由规则(正则)分发到views
#3.views去调用Model,交互数据
#4.views将数据渲染到模板中
#5.模板呈现给用户
二、数据库连接与ORM模型
2.1数据库连接配置
默认是sqlite3数据库,在使用ORM模型之前,需要先生成迁移文件,在执行迁移命令,在数据库中生成这些模型对应的表。
- 先生成迁移文件
python manage.py makemigrations
- 开始迁移(生成表,修改表,删除表)
python manage.py migrate
【注意】:一但生成了迁移文件并且迁移成功之后,不要删除迁移文件。
2.2初步使用ORM模型
定app模块中的models.py一个用户(客户)模型
from django.db import models
class UserEntity(models.Model):
# 默认情况下会自动创建id主键
name = models.CharField(max_length=20)
age = models.IntegerField(default=0)
phone = models.CharField(max_length=11)
class Meta:
# 指定当前模型类映射成哪一个表
db_table = 'app-user'
模型创建完成后,先后执行生成迁移文件和迁移
2.3CURD
查询
userEntity.objects.all() #查询所有
UserEntity.objects.get(pk=id) #根据主键值查询一个实体对象
增加或更新
u1 = UserEntity()
u1.name = '向佳杰'
u1.age = '19'
u1.phone = 18200244902
#保存模型对象
u1.save()
def add_user(request): # 从GET请求中读取数据 # request.GET.get('name') # request.GET是一个dict字典类型,保存的是查询参数 name = request.GET.get('name', None) age = request.GET.get('age', 0) phone = request.GET.get('phone', None) # 验证数据是否完整 if not all((name, age, phone)): return HttpResponse('<h3 style="color:red">请求参数不完整</h3>', status=400) u1 = UserEntity() u1.name = name u1.age = age u1.phone = phone u1.save() return redirect('/user/list')
删除
u=UserEntity.objjects.get(1)u.delete #删除
def delete_user(request): # 查询参数有id reqId = request.GET.get('id') # 验证id是否存在 if reqId: try: user = UserEntity.objects.get(id=reqId) user.delete() html = """ <p> %s 删除成功,三秒后自动跳转到<a href="/user/list">列表</a></p> <script> setTimeout(function(){ open('/user/list', target='_self'); }, 3000) </script> """ % reqId return HttpResponse(html) except: return HttpResponse('%s不存在' % reqId)
更新
u=UserEntity.objjects.get(3)u.name='小杰'u.save() #更新
def update_user(request): # 查询参数有id,name,phone reqId = request.GET.get('id', None) reqName = request.GET.get('name', None) reqPhone = request.GET.get('phone', None) if not reqId: return HttpResponse('id参数必须提供', status=400) # 通过模型查询id的用户是否存在(表中的数据(记录)是否存在) try: # Model类.objects.get()可能会报异常--尝试捕获 dbUser = UserEntity.objects.get(id=reqId) if any([reqName, reqPhone]): # name或phone任意一个存在即可 if reqName: dbUser.name = reqName if reqPhone: dbUser.phone = reqPhone dbUser.save() return redirect('/user/list') return HttpResponse('参数不正确', status=404) except: return HttpResponse('%s的用户是不存在的' % reqId, status=404)
三、Admin的site站点配置
from django.db import models# Create your models here.# 客户的用户表class UserEntity(models.Model): name = models.CharField(max_length=20, verbose_name='账号') age = models.IntegerField(default=0, verbose_name='年龄') phone = models.CharField(max_length=11, verbose_name='手机号', blank=True, # 站点的表单字段值可以为空 null=True) # 数据表的字段可以是null值 # 把对象转换为名字 def __str__(self): return self.name class Meta: # 设置表名 db_table = 'app-user' verbose_name = '客户管理' # 设置复数的表示方式 verbose_name_plural = verbose_name
四、综合案例-水果管理
3.1模型设计
# Fruit 水果模型类 (name,price,source,ctae_type_id)class FruitEntity(models.Model): name = models.CharField(max_length=20, verbose_name='水果名') price = models.FloatField(verbose_name='价格') source = models.CharField(max_length=30, verbose_name='原产地') category = models.ForeignKey(CateTypeEntity, on_delete=models.CASCADE) def __str__(self): return self.name + "-" + self.source class Meta: db_table = 't_fruit' verbose_name = '水果表' verbose_name_plural = verbose_name# FruitImage 水果图片模型(friut_id,url,width,height,name)# CateType 水果分类(name,order_num)# 水果分类模型class CateTypeEntity(models.Model): name = models.CharField(max_length=20, verbose_name='分类名') order_num = models.IntegerField(verbose_name='排序') def __str__(self): return self.name class Meta: db_table = 'app-category' ordering = ['-oder_num'] # 指定排序字段,-表示降序# Store 水果商店(name,name,boss_name,phone,address,city,(lat, lon #经纬度))# Storedetail 水果商店的详情
3.1模板的基本使用
循环语句块
{% for item in items %}{% endfor %}
分支循环
{% if 条件表达式 %}{% endif %}
变量
{{ 变量名 }}
在views.py视图函数中,渲染模板
return render(request,'fruit/list.html', locals())
3.2页面设计
{% block name %}{% endblock %}
{% extends "base.html" %}