python django ajax 逻辑推理_Python运维之路(Django基础、Ajax、Model)

Django基础

一.安装

pip3 install Django==1.10

二.创建Django项目

两种方式:使用pycharm工具进行创建

使用终端命令进行创建

终端方式:

django-admin startproject mysite

三. 创建应用APP

cd mysite

python3 manage.py startapp cmdb#manage.py django程序的启动文件#执行完成之后会出现一个cmdb目录

四. Django程序目录

五、启动程序

两种方式:使用pycharm工具进行启动

使用终端命令进行创建进入项目, python manage.py runserver 127.0.0.1:8000

六、创建数据表

python manage.py makemigrations #生成配置文件

python manage.py migrate #根据配置文件创建数据库相关 表

七、配置文件(均在settings.py中)

1、数据库

DATABASES ={'default': {'ENGINE': 'django.db.backends.mysql','NAME':'dbname','USER': 'root','PASSWORD': 'xxx','HOST': '','PORT': '',

}

}

2、模版

TEMPLATE_DIRS =(

os.path.join(BASE_DIR,'templates'),

) #添加模版

3、静态文件

STATIC_URL ='/fff/'

STATICFILES_DIRS = (

os.path.join(BASE_DIR,'statics'),

) #添加静态文件 fff名字可自定义 在程序中用此名字引入即可

4.应用

INSTALLED_APPS =['django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles','cmdb', #添加应用

]

八、路由系统

1、每个路由规则对应一个view中的函数

url(r'^index/(\d*)', views.index),

url(r'^manage/(?P\w*)/(?P\d*)', views.manage),

url(r'^manage/(?P\w*)', views.manage,{'id':333}),

#views.manage及views.index都是urls.py中指定的函数名

普通路由示例:

from django.conf.urls importurlfrom django.contrib importadminfrom app01 importviewsfrom django.conf.urls importurl, include####路由系统

urlpatterns =[#url(r'^admin/', admin.site.urls),

url(r'^index/', views.index),

url(r'^login/', views.login),

url(r'^detail1/(\d+)/(\d+)', views.detail1),

url(r'^detail2/(?P\d+)/(?P\d+)/', views.detail2),

]

普通路由 django urls.py

from django.shortcuts importrenderimportjson#Create your views here.

from django.shortcuts importHttpResponse####路由系统

defindex(request):return HttpResponse("index")deflogin(request):return HttpResponse("login")defdetail1(request,id,nid):print(id,nid)return HttpResponse("detail1")defdetail2(request,p1,x2):print(p1,x2)return HttpResponse("detail2")

普通路由 appname views.py

动态路由(翻页 查看详情)示例:

from django.conf.urls importurlfrom django.contrib importadminfrom app01 importviewsfrom django.conf.urls importurl, include##动态路由

urlpatterns =[#url(r'^admin/', admin.site.urls),

url(r'^index/(\d+)/', views.index),

url(r'^detail/(\d+)/', views.detail),

]

动态路由 django urls.py

###动态路由

from django.shortcuts importrender

USER_LIST=[]for item in range(94):

temp= {"id":item,"username":"lhq"+str(item),"email":"email"+str(item)}

USER_LIST.append(temp)defindex(request,page):print(page)#1 0-9

#2 10-19

#3 20-29

#...

page =int(page)

start= (page - 1)*10end= page*10user_list=USER_LIST[start:end]return render(request,"index.html",{"user_list":user_list})defdetail(request,nid):

nid=int(nid)

current_detail_dict=USER_LIST[nid]return render(request,"detail.html",{"current_detail_dict":current_detail_dict})

动态路由 appname views.py

Title
ID用户名email
{{ item.id }} {{ item.username }}查看详情

动态路由 template index.html

Title
  • {{ current_detail_dict.id }}
  • {{ current_detail_dict.username }}
  • {{ current_detail_dict.email }}

动态路由 template detail.py

2、根据app对路由规则进行一次分类

url(r'^web/',include('app01.urls')),

django中的路由系统和其他语言的框架有所不同,在django中每一个请求的url都要有一条路由映射,这样才能将请求交给对一个的view中的函数去处理。其他大部分的Web框架则是对一类的url请求做一条路由映射,从而使路由系统变得简洁。

九、Template模板渲染

#views.py 配置:

#return render(request, 'index.html', {'data': data_list })

1.调用后端传递的数据

username:{{user_obj.username}}

E-mail:{{user_obj.email}}

2、模版语言

模板中也有自己的语言,该语言可以实现数据展示

{{ item }}

{% for item in item_list %}  {{ item }}  {% endfor %}

forloop.counter

forloop.first

forloop.last

{% if ordered_warranty %}  {% else %} {% endif %}

母板:{% block title %}{% endblock %}

子板:{% extends "base.html" %}

{% block title %}{% endblock %}

帮助方法:

{{ item.event_start|date:"Y-m-d H:i:s"}}

{{ bio|truncatewords:"30" }}

{{ my_list|first|upper }}

{{ name|lower }}

3、自定义模版(filter simple_tag)

a、在app中创建templatetags模块(名字一定)

b、创建任意 .py 文件,如:xx.py

c. register = template.Library() (register一定)

d. 在创建函数前

#创建函数

@register.filterdeff1(value):return value + "666"

e.在使用自定义simple_tag的html文件中导入之前创建的 xx.py 文件名

{% load xx %}

f.在settings中注册app名称

filter与simple_tag差异:

filter:1.传参限制 只能传递 一个或者两个

一个参数:{{ k1|f1 }}

两个参数:{{ k1|f1:"lhq"}}2.支持模版语言的if条件

simple_tag:1.传参数无限制

参数:{% f2 1 2 3 4 %}2.不支持模版语言的if条件

自定义模版示例:

from django.conf.urls importurl, include##自定义模版 filter

urlpatterns =[#url(r'^admin/', admin.site.urls),

url(r'^web/',include("app01.urls")),

]

自定义模版 django urls

from django.conf.urls importurlfrom django.contrib importadminfrom app01 importviews##自定义模版 filter 页面布局 ajax

urlpatterns =[

url(r'^admin/', admin.site.urls),

url(r'^template/(\d+)/', views.template), #app多的话 可以将urls倒入 app里面的urls是自己创建的

自定义模版 app01 urls.py 自己创建

#!/usr/bin/env python#_*_coding:utf-8_*_#自定义模版 filter

from django importtemplatefrom django.utils.safestring importmark_safefrom django.template.base importNode,TemplateSyntaxError#resolve_variable

register =template.Library()

@register.filter#参数只能传2个 3个以上需要split 支持if条件

deff1(value,arg):return value + "666" +arg

@register.simple_tag#参数无限制

deff2(s1,s2,s3,s4):return s1 + s2 + s3 +s4

@register.filterdeff3(value):if value == "VVV":returnTruereturnFalse

@register.simple_tag#不支持

deff3(value):if value == "VVV":returnTruereturn False

自定义模版 templatetags xx.py 自创建

settings中注册app01

from django.shortcuts importrender#自定义模版 filter

deftemplate(request,arg):returnrender(request,"template.html",

{'k1':"VVV",'k2':[11,22,33],'k3':{'nid':12,'name':"alex"}})

自定义模版 app01 views.py

{##自定义模版 filter#}

{% load xx %}

Title

{{ k2.1}}

{{ k3.name }}

{#result:VVV 22 alex#}

{% for item in k2 %}

{{ item }},{{ forloop.counter }},{{ forloop.counter0 }},{{ forloop.first }},{{ forloop.last }},{{ forloop.revcounter }}

{% endfor %}

{#result:#}

{#列对应的顺序为:#}

{#item forloop.counter forloop.counter0 forloop.first forloop.last forloop.revcounter #}

{##}

{#11,1,0,True,False,3 #}

{##}

{#22,2,1,False,False,2#}

{##}

{#33,3,2,False,True,1#}

{% if k1 == "v1" %}

V1

{% elif k1 == "v2" %}

V2

{% else %}

7777

{% endif %}

{#result:#}

{#777 #}

{{ k1 }}

{{ k1|lower }}

{{ k1|f1:"lhq"}}

{#result:VVV vvv VVV666lhq#}

{% f2 1 2 3 4 %}

{#result:10#}

{% if k1|f3 %}

True

{% else %}

False

{% endif %}

{##result:True#}

自定义模版django template template.html

简介

{{ k1 }} #获取k1的值

{{ k2.1 }} #获取索引为1的值

{{ k3.name }} #获取key为name的值 注意都是.

forloop.counter 按照索引从小到大排序 (从1开始)

forloop.counter0 按照索引从小到大排序 (从0开始)

forloop.first 是否是第一个

forloop.last 是否是最后一个

forloop.revcounter 按照索引从大到小排序 (从1开始)

{{ k1|lower }} 将k1的值变小写

{{ k1|f1 }} 将k1的值作为f1的参数 传递过去

{{ k1|f1:"lhq" }} 将k1的值作为f1的参数 传递过去 :后面是f1的第二个参数

4.模版的继承

母板:{% block title %}{% endblock %}

子板:{% extends "base.html" %}

{% block title %}{% endblock %}

include

小组件: x.html

{% include 'x.html' %}

示例:(页面布局)

#页面布局

defassets(request):

assets_list=[]for i in range(10):

temp= {"hostname":"h1" + str(i),"port":80}

assets_list.append(temp)return render(request,"assets.html",{"assets_list":assets_list})defuserinfo(request):

user_list=[]for i in range(10):

temp= {"username":"h1" + str(i),"salary":90}

user_list.append(temp)return render(request,"userinfo.html",{"user_list":user_list})

app01 views.py

from django.conf.urls importurlfrom django.contrib importadminfrom app01 importviews

urlpatterns=[

url(r'^assets/', views.assets),

url(r'^userinfo/', views.userinfo),

]

app01 urls.py

from django.conf.urls importurl, include

urlpatterns=[#url(r'^admin/', admin.site.urls),

url(r'^web/',include("app01.urls")),

]

django urls.py

height: 48px;

background-color: cadetblue;

}

.pg-body{

min-height: 500px;

}

.pg-body .body-menu{

width:20%;

float: left;

}

.pg-body .body-content{

width:80%;

float: left;

}

.pg-footer{

height: 100px;

background-color: brown;

}

.active{

background-color: aquamarine;

color: white;

}{% block css %}{% endblock %}

后台系统V1
{% block body %}{% endblock %}

{% block js %}{% endblock %}

django template layout.html 母板

{% extends 'layout.html' %}

{% block body %}

{{ item.hostname }}{{ item.port }}
{% endblock %}

django template assets.html 子板

{% extends 'layout.html' %}

{% block css %}{% endblock %}

{% block body %}

  • {% for item in user_list %}
  • {{ item.username }},{{ item.salary }}{% endfor %}
{% endblock %}

{% block js %}

{% endblock %}

django template userinfo.html 主板

Ajax

1、XMLHttpRequest对象(原生Ajax)

2、jQuery - XMLHttpRequest对象(jQuery ajax)

3、跨域Ajax

浏览器同源策略:

Ajax,只能给自己的域名发请求

跨域名,浏览器做拦截

偷偷发请求 不刷新页面

用户登陆示例:

from django.shortcuts importrenderimportjson#Create your views here.

from django.shortcuts importHttpResponse#ajax

defajax_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"] =TruereturnHttpResponse(json.dumps(ret))else:

ret["message"] = "用户名或密码错误"

returnHttpResponse(json.dumps(ret))return render(request,"ajax_demo.html")

app01 views.py

from django.conf.urls importurl, include

urlpatterns=[#url(r'^admin/', admin.site.urls),

url(r'^web/',include("app01.urls")),

]

django urls.py

from django.conf.urls importurlfrom django.contrib importadminfrom app01 importviews##自定义模版 filter 页面布局 ajax

urlpatterns =[

url(r'^admin/', admin.site.urls),

url(r'^ajax_demo/', views.ajax_demo),

]

app01 urls.py

{#ajax_demo#}

Title

用户名:

密码:

$.ajax({

url:'/web/ajax_demo/',

type:"POST",

data:{"user":$('#username').val(),"pwd":$("#pwd").val()},

dataType:"json",

success:function(data) {//data = {status:True,message:"} 字符串

//data 对象//var data_dict =JSON.parse(data);if(data.status){

location.href= "http://wwww.baidu.com";

}else{

alert(data.message);

}

}

})

}

django template ajax_demo.html

settings设置:

STATIC_URL = '/static/'STATICFILES_DIRS=(

os.path.join(BASE_DIR,'static'),

)#'django.middleware.csrf.CsrfViewMiddleware',

Model

一、创建表

1、基本结构

from django.db importmodelsclassuserinfo(models.Model):

name= models.CharField(max_length=30)

email=models.EmailField()

memo= models.TextField()

1、models.AutoField  自增列 = int(11)

如果没有的话,默认会生成一个名称为 id 的列,如果要显示的自定义一个自增列,必须将给列设置为主键 primary_key=True。2、models.CharField  字符串字段

必须 max_length 参数3、models.BooleanField  布尔类型=tinyint(1)

不能为空,Blank=True4、models.ComaSeparatedIntegerField  用逗号分割的数字=varchar

继承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_places8、models.EmailField  字符串类型(正则表达式邮箱) =varchar

对字符串进行正则表达式9、models.FloatField  浮点类型 =double10、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  正Integer16、models.PositiveSmallIntegerField  正smallInteger17、models.SlugField  减号、下划线、字母、数字18、models.SmallIntegerField  数字

数据库中的字段有:tinyint、smallint、int、bigint19、models.TextField  字符串=longtext20、models.TimeField  时间 HH:MM[:ss[.uuuuuu]]21、models.URLField  字符串,地址正则表达式22、models.BinaryField  二进制23、models.ImageField 图片24、models.FilePathField 文件

字段汇总

1、null=True

数据库中字段是否可以为空2、blank=True

django的 Admin 中添加数据时是否可允许空值3、primary_key =False

主键,对AutoField设置主键后,就会代替原来的自增 id 列4、auto_now 和 auto_now_add

auto_now 自动创建---无论添加或修改,都是当前操作的时间

auto_now_add 自动创建---永远是创建时的时间5、choices

GENDER_CHOICE=(

(u'M', u'Male'),

(u'F', u'Female'),

)

gender= models.CharField(max_length=2,choices =GENDER_CHOICE)6、max_length7、default  默认值8、verbose_name  Admin中字段的显示名称9、name|db_column  数据库中的字段名称10、unique=True  不允许重复11、db_index =True  数据库索引12、editable=True  在Admin里是否可编辑13、error_messages=None  错误提示14、auto_created=False  自动创建15、help_text  在Admin中提示帮助信息16、validators=[]17、upload-to 将图片传至某个目录下

参数汇总

2、连表结构

一对多:models.ForeignKey(其他表)

多对多:models.ManyToManyField(其他表)

一对一:models.OneToOneField(其他表)

二、操作表

1、基本操作

#增

models.Tb1.objects.create(c1='xx', c2='oo') 增加一条数据,可以接受字典类型数据 **kwargs

obj= models.Tb1(c1='xx', c2='oo')

obj.save()#删

models.Tb1.objects.filter(name='seven').delete() #删除指定条件的数据#改

models.Tb1.objects.filter(name='seven').update(gender='0') #将指定条件的数据更新,均支持 **kwargs

obj = models.Tb1.objects.get(id=1)

obj.c1= '111'obj.save()#修改单条数据#查

models.Tb1.objects.get(id=123) #获取单条数据,不存在则报错(不建议)

models.Tb1.objects.all() #获取全部

models.Tb1.objects.filter(name='seven') #获取指定条件的数据

2、基本扩展操作(双下划线)

#获取个数

models.Tb1.objects.filter(name='seven').count()#大于,小于

models.Tb1.objects.filter(id__gt=1) #获取id大于1的值

models.Tb1.objects.filter(id__lt=10) #获取id小于10的值

models.Tb1.objects.filter(id__lt=10, id__gt=1) #获取id大于1 且 小于10的值#in

models.Tb1.objects.filter(id__in=[11, 22, 33]) #获取id等于11、22、33的数据

models.Tb1.objects.exclude(id__in=[11, 22, 33]) #not in#contains

models.Tb1.objects.filter(name__contains="ven")

models.Tb1.objects.filter(name__icontains="ven") #icontains大小写不敏感

models.Tb1.objects.exclude(name__icontains="ven")#range

models.Tb1.objects.filter(id__range=[1, 2]) #范围bettwen and#其他类似

startswith,istartswith, endswith, iendswith,#order by

models.Tb1.objects.filter(name='seven').order_by('id') #asc

models.Tb1.objects.filter(name='seven').order_by('-id') #desc#limit 、offset

models.Tb1.objects.all()[10:20]#group by

from django.db.models importCount, Min, Max, Sum

models.Tb1.objects.filter(c1=1).values('id').annotate(c=Count('num'))#SELECT "app01_tb1"."id", COUNT("app01_tb1"."num") AS "c" FROM "app01_tb1" WHERE "app01_tb1"."c1" = 1 GROUP BY "app01_tb1"."id"

用户登陆界面示例:

from django.db importmodels#Create your models here.

classUserType(models.Model):

name= models.CharField(max_length=32)def __str__(self):return self.name #去除repr 默认是自带object

classuserinfo(models.Model):

nid= models.AutoField(primary_key=True)

name= models.CharField(max_length=30)

email=models.EmailField()

memo=models.TextField()

img= models.ImageField(null=True,blank=True)

user_type= models.ForeignKey("UserType",null=True,blank=True)#UserType不加引号 需要UserType必须在userinfo表上面否则会报错 加引号表示在上面和下面都可以#null表示数据库可为空#blank表示django后台可为空

app01 models.py

#前提django urls include

from django.conf.urls importurlfrom django.contrib importadminfrom app01 importviews##自定义模版 filter 页面布局 ajax

urlpatterns =[

url(r'^admin/', admin.site.urls),

]

app01 urls.py

img会报错:需要安装pillow 若是二次创建表需要null=true blank=true

python3 manage.py makemigrations

python3 manage.py migrate

python3 manage.py createsupperuser 创建超级用户

示例:

classUserProfile(models.Model):

user_info= models.OneToOneField('UserInfo')

username= models.CharField(max_length=64)

password= models.CharField(max_length=64)def __unicode__(self):returnself.usernameclassUserInfo(models.Model):

user_type_choice=(

(0, u'普通用户'),

(1, u'高级用户'),

)

user_type= models.IntegerField(choices=user_type_choice)

name= models.CharField(max_length=32)

email= models.CharField(max_length=32)

address= models.CharField(max_length=128)def __unicode__(self):returnself.nameclassUserGroup(models.Model):

caption= models.CharField(max_length=64)

user_info= models.ManyToManyField('UserInfo')def __unicode__(self):returnself.captionclassHost(models.Model):

hostname= models.CharField(max_length=64)

ip=models.GenericIPAddressField()

user_group= models.ForeignKey('UserGroup')def __unicode__(self):return self.hostname

创建表结构

user_info_obj = models.UserInfo.objects.filter(id=1).first()printuser_info_obj.user_typeprintuser_info_obj.get_user_type_display()printuser_info_obj.userprofile.password

user_info_obj= models.UserInfo.objects.filter(id=1).values('email', 'userprofile__username').first()printuser_info_obj.keys()print user_info_obj.values()

一对一操作

user_info_obj = models.UserInfo.objects.get(name=u'lhq')

user_info_objs=models.UserInfo.objects.all()

group_obj= models.UserGroup.objects.get(caption='CEO')

group_objs=models.UserGroup.objects.all()#添加数据#group_obj.user_info.add(user_info_obj)#group_obj.user_info.add(*user_info_objs)

#删除数据#group_obj.user_info.remove(user_info_obj)#group_obj.user_info.remove(*user_info_objs)

#添加数据#user_info_obj.usergroup_set.add(group_obj)#user_info_obj.usergroup_set.add(*group_objs)

#删除数据#user_info_obj.usergroup_set.remove(group_obj)#user_info_obj.usergroup_set.remove(*group_objs)

#获取数据#print group_obj.user_info.all()#print group_obj.user_info.all().filter(id=1)

#获取数据#print user_info_obj.usergroup_set.all()#print user_info_obj.usergroup_set.all().filter(caption='CEO')#print user_info_obj.usergroup_set.all().filter(caption='DBA')

多对多操作

Model F/Q

#F 使用查询条件的值

from django.db.models importF

models.Tb1.objects.update(num=F('num')+1)

#Model Q

form =IndexForm()from django.db.models importQ

q1=Q()

q1.connector= 'OR'q1.children.append(('id',1))

q1.children.append(('id',2))

q1.children.append(('id',3))

obj=models.UserType.objects.filter(q1)for item inobj:print(item.id,item.caption)#result:

#1 CE0

#2 CE1

#3 CE2

form =IndexForm()from django.db.models importQ

con=Q()

q1=Q()

q1.connector= 'OR'q1.children.append(('id',1))

q1.children.append(('id',2))

q1.children.append(('id',3))

q2=Q()

q2.connector= 'OR'q2.children.append(('caption','CE1'))

q2.children.append(('caption','CE2'))

con.add(q1,'AND')

con.add(q2,'AND')

obj=models.UserType.objects.filter(con)for item inobj:print(item.id,item.caption)#result:#2 CE1#3 CE2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值