一、路由系统
路由系统就是通过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语句