一、路由系统
路由系统就是通过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\d+)/(?P \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.pyUSER_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对应的页面
Title
ID | 用户名 | 邮箱 | |
---|---|---|---|
{ { foo.id }} | { { foo.username }} | { { foo.email }} | 详细信息 |
这个是detail对应的页面
Title
- { { cdd.id }}
- { { cdd.username }}
- { { cdd.email }}
模板语言
{% for item in user_list %}
{% if k1|f3 %}XXX
{% else %}XXX
{% 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 templateregister=template.Library()#返回值的名称必须叫做register,这个是不可以修改的@register.filterdef 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 %}Title {% if k1|f3 %}Ture
{% else %}False
{% endif %}
from django import templateregister=template.Library()@register.filterdef f1(value,arg): return value+'666'+arg@register.simple_tagdef f2(s1,s2,s3,s4): return s1+s2+s3+s4@register.filterdef f3(value): if value == 'vvv': return True return False
模板的使用实例:
{% block css %}{% endblock %} 后台系统V1{% block js %}{% endblock %}{% block body %}{% endblock %}
{% extends 'layout.html' %}{% block css %} {% endblock %}{% block body %}
- {% for item in user_list %}
- { { item.username }},{ { item.salary }} {% endfor %}
这样相同的模板就可以使用不一样的js和css了
Ajax
Title 用户名
密码
# 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 jsondef 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语句