一、路由系统
路由系统就是通过Django来实现的类似nginx rewrite的功能,并且支持正则表达式的结构
普通关系是
/index/ -> 函数
动态关系:
在django里面urls.py里面 urlpatterns = [ url(r'^admin/', admin.site.urls), # url(r'^login/', views.login), # url(r'^detail1/(d+)/', views.detail1), # url(r'^detail2/(d+)/(d+)/', views.detail2), # url(r'^detail3/(?P<p1>d+)/(?P<x1>d+)/', views.detail3), ]
上面的三条detail就是通过正则来实现的,下面是对应的程序
# def detail1(render,nid): # print(nid) # return HttpResponse("ok") # # def detail2(render,nid,nnid): # print(nid,nnid) # return HttpResponse("ok") # # def detail3(render,p1,x1): # print(p1,x1) # return HttpResponse("ok")
现在来说一下路由分发
这个是实现的程序内部
view.py USER_INFO=[] for item in range(98): temp={'id':item,'username':'wzc'+str(item),'email':'email'+str(item)} USER_INFO.append(temp) def index(request,page): print(page) page=int(page) start_page=(page-1)*10 end_page=page*10 user_list=USER_INFO[start_page:end_page] return render(request,'index.html',{'user_list':user_list}) def detail(request,nid): nid=int(nid) cdd=USER_INFO[nid] return render(request,'detail.html',{'cdd':cdd})
我们使用的时候,只用到了index和detail,所以路由规则的时候只需要写这两条,#自己去掉就好了
urls.py # url(r'^index/(d+)', views.index), # url(r'^detail/(d+)', views.detail),
这个是index对应的页面
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <table> <thead> <th>ID</th> <th>用户名</th> <th>邮箱</th> </thead> <tbody> {% for foo in user_list %} <tr> <td>{{ foo.id }}</td> <td>{{ foo.username }}</td> <td>{{ foo.email }}</td> <td><a href="/detail/{{ foo.id }}">详细信息</a></td> </tr> {% endfor %} </tbody> </table> </body> </html>
这个是detail对应的页面
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <ul> <li> {{ cdd.id }} </li> <li> {{ cdd.username }} </li> <li> {{ cdd.email }} </li> </ul> </body> </html>
模板语言
{% for item in user_list %} <li>XXXXX</li> {% endfor %}
{% if k1|f3 %} <h1>XXX</h1> {% else %} <h1>XXX</h1> {% endif %}
内置方法:
{{ item.event_start|data:"Y-m-d H:i:s"}} {{ bio|truncatewords:"30"}}只显示30个字符 {{ my_list|first|upper}}首字母大写 {{ name|lower}}全部小写
自定义方法:
filter
simple_tag
1、创建指定文件,并且文件的名称不能改,必须使用templatetags
在app里面创建目录
2、创建任意名字的py文件
from django import template register=template.Library()#返回值的名称必须叫做register,这个是不可以修改的 @register.filter def f1(value,arg): return value+'666'+arg
@register.filter ,在定义函数的时候,使用这个了以后,就变成模板语言里面的函数,这个就是创建对应的函数
3、在html模板头部必须要执行
{% load XX %}
这样就相当于是导入脚本
4、如何使用
{{ k1|f1}},前面是对应的k值,后面是对应的函数值,返回的结果就是把k1对应的value值传到函数里面后得到的数据
5、需要在settings里面注册对应的子项目名称
传参数的使用方法是:
{{ k1|f1:"123"}}
需要注意的是filter和sample_tag是有区别的
filter:对应的参数只能有一个,使用方法如上,支持在if里面当做条件,因为使用管道符
sample_tag:参数可以有多个,使用方法{% f2 1 2 3%},不支持在if的条件中使用
{% load xx %} <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> {% if k1|f3 %} <h1>Ture</h1> {% else %} <h1>False</h1> {% endif %} </body> </html>
from django import template register=template.Library() @register.filter def f1(value,arg): return value+'666'+arg @register.simple_tag def f2(s1,s2,s3,s4): return s1+s2+s3+s4 @register.filter def f3(value): if value == 'vvv': return True return False
模板的使用实例:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title></title> <link rel="stylesheet" href="..." /> <style> .pg-header{ height: 48px; background-color: cadetblue; } .pg-body{ min-height: 500px; } .pg-body .body-menu{ 20%; float: left; } .pg-body .body-content{ 80%; float: left; } .pg-footer{ height: 100px; background-color: brown; } .active{ background-color: aquamarine; color: white; } </style> {% block css %}{% endblock %} </head> <body> <div class="pg-header"> 后台系统V1 </div> <div class="pg-body"> <div class="body-menu"> <ul> <li><a href="/web/userinfo">用户管理</a></li> <li><a href="/web/assets">资产管理</a></li> </ul> </div> <div class="body-content"> {% block body %}{% endblock %} </div> </div> <div class="pg-footer"></div> <script src="xxx"></script> {% block js %}{% endblock %} </body> </html>
{% extends 'layout.html' %} {% block css %} <style></style> {% endblock %} {% block body %} <ul> {% for item in user_list %} <li>{{ item.username }},{{ item.salary }}</li> {% endfor %} </ul> {% endblock %} {% block js %} {% endblock %}
这样相同的模板就可以使用不一样的js和css了
Ajax
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <div> <p>用户名<input type="text" id="username"/></p> </div> <div> <p>密码<input type="password" id="pwd"/></p> </div> <input type="button" value="提交" onclick="SubmitForm();"/> <script src="/static/jquery-1.12.4.js"></script> <script> function SubmitForm() { $.ajax( { url:'/web/ajax_demo/', type:'POST', data:{'user':$('#username').val(),'pwd':$('#pwd').val()}, dataType:'json', success:function (data) { console.log(data) if (data.status){ location.href="https://www.baidu.com" }else { alert(data.message) } {# if(data == '1' ){#} {# location.href="https://www.baidu.com"#} {# }else {#} {# alert("用户名密码错误")#} {# }#} } } ) } </script> </body> </html>
# def ajax_demo(request): # if request.method == "POST" : # user=request.POST.get('user',None) # pwd=request.POST.get('pwd',None) # if user == "111" and pwd == "222": # return HttpResponse('1') # else: # return HttpResponse('2') # return render(request,'ajax_demo.html') import json def ajax_demo(request): if request.method == "POST" : ret={'status':False,'message':""} user=request.POST.get('user',None) pwd=request.POST.get('pwd',None) if user == "111" and pwd == "222": ret['status']=True return HttpResponse(json.dumps(ret)) else: ret['message']="用户名密码错误" return HttpResponse(json.dumps(ret)) return render(request,'ajax_demo.html')
model,ORM
1、创建(CURD)数据库表
class -> DB,表
DB,表 -> 类
a. app.models.py写类
from django.db import models
class userinfo(models.Model):
name = models.CharField(max_length=30) # string
email = models.EmailField() # string,帮助admin做输入验证,modelform
memo = models.TextField() # text
b. python manage.py makemigrations
python manage.py migrate
python manage.py createsuperuser
from django.db import models # Create your models here. class userinfo(models.Model): nid=models.AutoField(primary_key=True) name=models.CharField(max_length=30) email=models.EmailField() memo=models.TextField() img=models.ImageField() user_type=models.ForeignKey('user_type',null=True,blank=True) class user_type(models.Model): name=models.CharField(max_length=32) def __str__(self): return self.name
2、操作数据库的数据
类
1、models.AutoField 自增列 = int(11)
如果没有的话,默认会生成一个名称为 id 的列,如果要显示的自定义一个自增列,必须将给列设置为主键 primary_key=True。
2、models.CharField 字符串字段
必须 max_length 参数
3、models.BooleanField 布尔类型=tinyint(1)
不能为空,Blank=True
4、models.ComaSeparatedIntegerField 用逗号分割的数字=varchar
input: 12,345,989871234,
继承CharField,所以必须 max_lenght 参数
5、models.DateField 日期类型 date
对于参数,auto_now = True 则每次更新都会更新这个时间;auto_now_add 则只是第一次创建添加,之后的更新不再改变。
6、models.DateTimeField 日期类型 datetime
同DateField的参数
7、models.Decimal 十进制小数类型 = decimal
必须指定整数位max_digits和小数位decimal_places
8、models.EmailField 字符串类型(正则表达式邮箱) =varchar
对字符串进行正则表达式
9、models.FloatField 浮点类型 = double
10、models.IntegerField 整形
11、models.BigIntegerField 长整形
integer_field_ranges = {
'SmallIntegerField': (-32768, 32767),
'IntegerField': (-2147483648, 2147483647),
'BigIntegerField': (-9223372036854775808, 9223372036854775807),
'PositiveSmallIntegerField': (0, 32767),
'PositiveIntegerField': (0, 2147483647),
}
12、models.IPAddressField 字符串类型(ip4正则表达式)
13、models.GenericIPAddressField 字符串类型(ip4和ip6是可选的)
参数protocol可以是:both、ipv4、ipv6
验证时,会根据设置报错
14、models.NullBooleanField 允许为空的布尔类型
15、models.PositiveIntegerFiel 正Integer
16、models.PositiveSmallIntegerField 正smallInteger
17、models.SlugField 减号、下划线、字母、数字
18、models.SmallIntegerField 数字
数据库中的字段有:tinyint、smallint、int、bigint
19、models.TextField 字符串=longtext
20、models.TimeField 时间 HH:MM[:ss[.uuuuuu]]
21、models.URLField 字符串,地址正则表达式
22、models.BinaryField 二进制
23、models.ImageField 图片 字符串
24、models.FilePathField 文件 字符串
a. 单表
b. 一对多:Forigkey
c. 多对多
d. 一对一
obj = model.UserInfo.objects.filter(name='alex')
print obj.query
queryset -> python,Django的类
[obj1,obj2,obj3]
obj = model.UserInfo.objects.filter(name='alex').values('id','email')
# select id from userinfo where name = 'alex'
queryset -> python,Django的类
[{'id':1},{'id': 2},]
obj = model.UserInfo.objects.filter(name='alex').value_list('id','email')
# select id from userinfo where name = 'alex'
queryset -> python,Django的类
[(1,'1@qq.com'),(2,'alex@11.com'),]
queryset.query => SQL语句