目录:
一、路由系统URL
1、Django请求生命周期
2、创建Django project
3、配置
4、编写程序
二、视图
三、模板
四、ORM操作
内容:
一、URL
1、Django请求生命周期
URL对应关系(匹配)-> 视图函数 -> 返回用户字符串
URL对应关系(匹配) -> 视图函数 -> 打开一个HTML文件,读取内容
2、创建Django project
django-admin startproject myproject
cd myproject
python manage.py startapp myapp
myproject
- myproject
- 配置文件
- url.py
- settings.py
- myapp
- views.py
- admin.py
- models.py #创建数据库表
3、配置
模板路径
静态文件路径
# CSRF
4、编写程序
a. url.py
/index/ -> func
b. views.py
def func(request):
#包含所有的请求数据
return HttpResponse('字符串')
return render(request, 'index.html',{'dict':dict})
return redirect(‘URL’)
c.模板语言
{% for i in item%}
<h1>{{ i }}</h1>
{% endfor %}
*************索引*************
<h2>{{ item.0 }}</h2>
d.后端获取前端的方法:
1、普通方式:get
2、特殊方式:input的type=checkbox方式(多选模式),需要使用getlist方法
3、文件获取:input的type=file方式,默认使用get只能取得文件名,需要说明的是,上传文件是上传到request.FILES中,而request.POST.get只是从request.FILES中获取文件名,可以通过request.FILES.get()
备注:
在获取文件时,需要在对应的form表单中添加 <form action='/login/' method='POST' enctype='multipart/form-data'>
obj=request.FILES.get('file_name')
obj.name # request.FILES.get('file_name')中包含很多参数,其中name表示获取文件名
f = open(obj.name, mode='wb')#准备一个文件,将上传的文件写入
for item in obj.chunks():#chunks表示文件一点一点上传到内存中,然后在通过内存写入
f.write(item)
f.close()
5、FBV(function base view)& CBV(class base view)
url ---> 函数名 FBV
url ---> 类 CBV
建议:两者都用
例子:
views.py文件 from django.views import View class Home(View): #重新这个方法是为了实现类装饰器的作用,因为dispaths先于get和post执行的 def dispath(self,request,*args,**kwargs): print('before) result = super(Home,self).dispath(request,*args,**kwargs) print('after') return result def get(self,request): print(request.method) return render(request,'home.html') def post(self,request): print(request.method) return render(request,'home.html') 备注: 查找(知道使用get还是post方法)操作是通过View类中的dispath方法中的getattr来反射的,dispath先于get和post方法执行 urls.py文件 from app01 import views urlpatterns = [ url(r'^home/',views.Home.as_view()), ]
4、模板语言第二波:
字典的循环:
user_dict = {
'k1': 'v1',
'k2':'v2',
'k3':'v3',
}
{% for k,v in user_dict.items%} #items还可以换成keys和values,和items一样都是不带括号的
{{k}}----{{v}}
{% endfor %}
5、 动态URL
urls.py文件中
url(r'^detail-(\d+).html', views.detail), #通过这种方式从url中可以取到后面的数字传递给函数中
views.py文件中
def detail(request,nid):
return HttpResponse(nid)#可以获取并返回该值
detail.html文件中
<li><a target="_blank",href="/detail-{{ k }}.html">{{ row.name }}</a></li>
URL路由系统总结:
1、普通静态路由设置
url(r'^index/', views.index),
2、动态的路由系统,可以对应一类路由,此类也可以对应多个,不过也需要严格匹配
url(r'^index-(d+).html', views.index),
3、多条件匹配
url(r'^index-(?P<uid>d+)-(?P<nid>d+).html', views.index),
对应的函数也发生变化:
def index(request,*args,**kwargs):
对应第二种情况,会把全部变量放入列表中,对应第三种情况,会把变量都放入字典里
4、name
对URL路由关系进行命名,以后可以根据此名称生成自己想要URL
urls.py文件: url(r'^abcdef//', views.index,name='i1'), url(r'^abcdef/(\d+)/(d+)/', views.index,name='i2'), url(r'^abcdef/(?P<nid>\d+)/(?P<uid>d+)/', views.index,name='i3'), 模板语言中: <form action="{% url "i1" %}" method="POST"> <form action="{% url "i2" 参数 %}" method="POST"> #这个参数可以任意添加,这种方式可以指定提交后返回特定的页面,也就是参数对应的页面 <form action="{% url "i3" nid=1 uid=2 %}" method="POST"> 注: 模板语言中: <form action="{{ request.path_info }}" method="POST"> #这个参数可以在提交后回到当前界面 同时在views.py文件中: def index(request,*args,**kwargs): from django.urls import reverse #专门做反转 url1 = reverse('i1') url2 = reverse('i2' args=(1,2,)) url3 = reverse('i3' kwargs={'nid':1, 'uid':2})
5、URL分级
全局urls.py文件: from django.conf.urls import url from django.contrib import admin from django.conf.urls import include urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^cmdb/', include("app01.urls") ), url(r'^home/', include("app02.urls") ), ] app01的urls.py文件中 from django.conf.urls import url from app01 import views urlpatterns = [ url(r'^login/', views.login), ] app02的urls.py文件中 from django.conf.urls import url from app02 import views urlpatterns = [ url(r'^login/', views.login), ]
四、ORM操作
创建类
1、根据类自动创建数据库表
2、根据数据库表创建数据
备注:
由于python3.5以后不支持mysqldb,所以使用pymysql代替,需要在创建的project的同名文件夹里__init__.py文件中添加如下配置:
1 import pymysql 2 pymysql.install_as_MySQLdb()
数据库操作步骤:
1、 在创建的settings里添加如下配置:
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 's14day19', 'USER': 'gavin', 'PASSWORD': 'gavin', 'HOST': '192.168.246.250', 'PORT': '3306', } }
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 's14day19', 'USER': 'gavin', 'PASSWORD': 'gavin', 'HOST': '192.168.246.250', 'PORT': '3306', 'OPTIONS': { 'init_command': "SET sql_mode='STRICT_TRANS_TABLES'" } } }
2、通过命令创建数据库
create database s14day19 charset utf8;
3、app的models配置里创建对应的类:
from django.db import models # Create your models here. #app01的名字默认叫app01_userinfo class UserInfo(models.Model): #id列自增,主键 username = models.CharField(max_length=32) password = models.CharField(max_length=64)
4、产生临时log文件,并生成数据库
a. python manage.py makemigrations (执行完毕后,会在app01的migration文件夹下发现多出来的log文件)
b. python manage.py migrate
5、ORM增删改查:
def orm(request): #增加数据方式一:(推荐第一种方式) models.UserInfo.objects.create( username = 'root', password = '123', ) #增加数据方式二 obj = models.UserInfo(username='root1',password='123') obj.save() #增加数据方式三 dic = {'username': 'root3','password':'123'} models.UserInfo.objects.create(**dic) #查询全体 result = models.UserInfo.objects.all() #返回的QuerySet类型,django提供的,是一个列表 for row in result: print(row.id,row.username,row.password) #查询单个 result1 = models.UserInfo.objects.filter(username='root') #删除 models.UserInfo.objects.filter(id=4).delete() #更新 models.UserInfo.objects.all().update(password='666') return HttpResponse('orm')
例子:登录对话框的认证
def login(request): u = request.POST.get('user') p = request.POST.get('pwd') obj = models.UserInfo.objects.filter(username=u,password=p).first() #如果不加first,获取的值为一个列表,如果有first或者的值为一个类,后者在没有获取值的情况下返回的是None
备注:
对数据库新增column时如果默认情况下需要对新增column进行赋值
创建超级管理员用户:
python3 manage.py createsuperuser
model创建类型:
字段:
AutoField(Field) - int自增列,必须填入参数 primary_key=True BigAutoField(AutoField) - bigint自增列,必须填入参数 primary_key=True 注:当model中如果没有自增列,则自动会创建一个列名为id的列 from django.db import models class UserInfo(models.Model): # 自动创建一个列名为id的且为自增的整数列 username = models.CharField(max_length=32) class Group(models.Model): # 自定义自增列 nid = models.AutoField(primary_key=True) name = models.CharField(max_length=32) SmallIntegerField(IntegerField): - 小整数 -32768 ~ 32767 PositiveSmallIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField) - 正小整数 0 ~ 32767 IntegerField(Field) - 整数列(有符号的) -2147483648 ~ 2147483647 PositiveIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField) - 正整数 0 ~ 2147483647 BigIntegerField(IntegerField): - 长整型(有符号的) -9223372036854775808 ~ 9223372036854775807 自定义无符号整数字段 class UnsignedIntegerField(models.IntegerField): def db_type(self, connection): return 'integer UNSIGNED' PS: 返回值为字段在数据库中的属性,Django字段默认的值为: 'AutoField': 'integer AUTO_INCREMENT', 'BigAutoField': 'bigint AUTO_INCREMENT', 'BinaryField': 'longblob', 'BooleanField': 'bool', 'CharField': 'varchar(%(max_length)s)', 'CommaSeparatedIntegerField': 'varchar(%(max_length)s)', 'DateField': 'date', 'DateTimeField': 'datetime', 'DecimalField': 'numeric(%(max_digits)s, %(decimal_places)s)', 'DurationField': 'bigint', 'FileField': 'varchar(%(max_length)s)', 'FilePathField': 'varchar(%(max_length)s)', 'FloatField': 'double precision', 'IntegerField': 'integer', 'BigIntegerField': 'bigint', 'IPAddressField': 'char(15)', 'GenericIPAddressField': 'char(39)', 'NullBooleanField': 'bool', 'OneToOneField': 'integer', 'PositiveIntegerField': 'integer UNSIGNED', 'PositiveSmallIntegerField': 'smallint UNSIGNED', 'SlugField': 'varchar(%(max_length)s)', 'SmallIntegerField': 'smallint', 'TextField': 'longtext', 'TimeField': 'time', 'UUIDField': 'char(32)', BooleanField(Field) - 布尔值类型 NullBooleanField(Field): - 可以为空的布尔值 CharField(Field) - 字符类型 - 必须提供max_length参数, max_length表示字符长度 TextField(Field) - 文本类型 EmailField(CharField): - 字符串类型,Django Admin以及ModelForm中提供验证机制 IPAddressField(Field) - 字符串类型,Django Admin以及ModelForm中提供验证 IPV4 机制 GenericIPAddressField(Field) - 字符串类型,Django Admin以及ModelForm中提供验证 Ipv4和Ipv6 - 参数: protocol,用于指定Ipv4或Ipv6, 'both',"ipv4","ipv6" unpack_ipv4, 如果指定为True,则输入::ffff:192.0.2.1时候,可解析为192.0.2.1,开启刺功能,需要protocol="both" URLField(CharField) - 字符串类型,Django Admin以及ModelForm中提供验证 URL SlugField(CharField) - 字符串类型,Django Admin以及ModelForm中提供验证支持 字母、数字、下划线、连接符(减号) CommaSeparatedIntegerField(CharField) - 字符串类型,格式必须为逗号分割的数字 UUIDField(Field) - 字符串类型,Django Admin以及ModelForm中提供对UUID格式的验证 FilePathField(Field) - 字符串,Django Admin以及ModelForm中提供读取文件夹下文件的功能 - 参数: path, 文件夹路径 match=None, 正则匹配 recursive=False, 递归下面的文件夹 allow_files=True, 允许文件 allow_folders=False, 允许文件夹 FileField(Field) - 字符串,路径保存在数据库,文件上传到指定目录 - 参数: upload_to = "" 上传文件的保存路径 storage = None 存储组件,默认django.core.files.storage.FileSystemStorage ImageField(FileField) - 字符串,路径保存在数据库,文件上传到指定目录 - 参数: upload_to = "" 上传文件的保存路径 storage = None 存储组件,默认django.core.files.storage.FileSystemStorage width_field=None, 上传图片的高度保存的数据库字段名(字符串) height_field=None 上传图片的宽度保存的数据库字段名(字符串) DateTimeField(DateField) - 日期+时间格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ] DateField(DateTimeCheckMixin, Field) - 日期格式 YYYY-MM-DD TimeField(DateTimeCheckMixin, Field) - 时间格式 HH:MM[:ss[.uuuuuu]] DurationField(Field) - 长整数,时间间隔,数据库中按照bigint存储,ORM中获取的值为datetime.timedelta类型 FloatField(Field) - 浮点型 DecimalField(Field) - 10进制小数 - 参数: max_digits,小数总长度 decimal_places,小数位长度 BinaryField(Field) - 二进制类型 字段
字符串类型
数字
时间
二进制
自增autoField(primary_key=True)
字段的参数:
null 字段是否可以为空
default 默认值
primary_key 主键
db_column 类名
db_index 是否是索引 db_index=True
unique unique=True 唯一索引
unique_for_date 只对时间做索引
unique_for_month
unique_for_year
auto_now 创建时自动生成,
auto_now_add 更新时,自动更新为当前时间
备注:auto_now auto_now_add
自动更新时一定要这种操作才会更新
obj = UserGroup.objects.filter(id=1).first()
obj.caption = 'CEO'
obj.save()
verbose_name -> django admin显示字段中文
editable -> django admin是否可以被编辑
error_messages -> 错误信息欠
help_text -> django admin提示
validators -> django form ,自定义错误信息(欠)
根据类对数据库表中的数据进行各种操作
一对多:
a. 外检
b.
外键字段_id
c.
models.tb.object.create(name='root', user_group_id=1)
d.
userlist = models.tb.object.all()
for row in userlist:
row.id
row.user_group_id
row.user_group.caption