首页 技术 正文
技术 2022年11月8日
0 收藏 818 点赞 1,880 浏览 8193 个字
上节内容回顾:
 1、请求周期
url> 路由 > 函数或类 > 返回字符串或者模板语言? Form表单提交:
提交 -> url > 函数或类中的方法
- ....
HttpResponse('....')
render(request,'index.html')
redirect('/index/')
用户 < < 返回字符串
(当接受到redirect时)自动发起另外一个请求
--> url ..... Ajax:
$.ajax({
url: '/index/',
data: {'k': 'v', 'list': [1,2,3,4], 'k3': JSON.stringfy({'k1': 'v'}))}, $(form对象).serilize()
type: 'POST',
dataType: 'JSON':
traditional: true,
success:function(d){
location.reload() # 刷新
location.href = "某个地址" # 跳转
}
})
提交 -> url -> 函数或类中的方法
HttpResponse('{}')
render(request, 'index.html', {'name': 'v1'})
<h1>{{ name }}</h1> -->
<h1>v1</h1> XXXXXXX redirect...
用户 <<<<< 字符串 2、路由系统URL
a. /index/ -> 函数或类
b. /index/(\d+) -> 函数或类
c. /index/(?P<nid>\d+) -> 函数或类
d. /index/(?P<nid>\d+) name='root' -> 函数或类
reverse()
{% url 'root' 1%}
e. /crm/ include('app01.urls') -> 路由分发 f. 默认值
url(r'^index/', views.index, {'name': 'root'}),#在url设置默认值 def index(request,name):#相关函数需要设置接收的形参
print(name)
return HttpResponse('OK') g. 命名空间 /admin/ include('app01.urls',namespace='m1')
/crm/ include('app01.urls',namespace='m1') app01.urls
/index/ name = 'n1' reverser('m1:n1') 3、后台取数据
def func(request):
request.POST
request.GET
request.FILES
request.getlist
request.method
request.path_info return render,HttpResponse,redirect 4、模板语言
render(request, 'index.html')
# for
# if
# 索引. keys values items all 5、 数据库 models操作
#创建一个表结构
class User(models.Model):
username = models.CharField(max_length=32)
email = models.EmailField() 有验证功能
Django Admin
无验证功能:
User.objects.create(username='root',email='asdfasdfasdfasdf')
User.objects.filter(id=1).update(email='') #创建一个表结构 用户属性表
class UserType(models.Model):
name = models.CharField(max_length=32) #创建一个表结构 用户信息表
class User(models.Model):
username = models.CharField(max_length=32)
email = models.EmailField()
user_type = models.ForeignKey("UserType")#外键 关联 UserType 表 user_list = User.objects.all()#获取User表,所有记录
for obj user_list:
obj.username,obj.email,obj.user_type_id,obj.user_type.name,obj.user_type.id user = User.objects.get(id=1)#获取ID为1 的记录 为对象
user. User.objects.all().values("username","user_type__name",)#获取所有记录 的username 和 跨表的name class UserType(models.Model):
name = models.CharField(max_length=32) #创建一个表结构 用户信息表
class User(models.Model):
username = models.CharField(max_length=32)
email = models.EmailField()
user_type = models.ForeignKey("UserType")#外键 关联
m = models.ManyToMany('UserGroup')#与 UserGroup 的 第三张关联表 多对多 #创建一个表结构 用户组表 多对多
class UserGroup(models.Model):
name = .... obj = User.objects.get(id=1)#获取记录对象
obj.m.add(2)#对第三张表进行添加关联
obj.m.add(2,3)
obj.m.add(*[1,2,3]) obj.m.remove(...)#对第三张表进行删除关联 obj.m.clear()#清除当前记录的所有关联关系 obj.m.set([1,2,3,4,5])#设置关联 (重新所有的设置) # 多个组,UserGroup对象
obj.m.all()#
obj.m.filter(name='CTO')#筛选出其中的一个组对象
知识点:
Views
- 请求的其他信息
from django.core.handlers.wsgi import WSGIRequest
request.environ
request.environ['HTTP_USER_AGENT']#请求头
      - 装饰器
FBV:
def auth(func):
def inner(reqeust,*args,**kwargs):
v = reqeust.COOKIES.get('username111')#获取 cookies中的值
if not v:
return redirect('/login/')
return func(reqeust, *args,**kwargs)
return inner
         CBV:
 from django import views
from django.utils.decorators import method_decorator
#装饰dispatch 后, 等于对类中的每一个函数进行了装饰
@method_decorator(auth,name='dispatch')#类中的 dispatch 为最先执行
class Order(views.View): # @method_decorator(auth)
# def dispatch(self, request, *args, **kwargs):
# return super(Order,self).dispatch(request, *args, **kwargs) # @method_decorator(auth)
def get(self,reqeust):
v = reqeust.COOKIES.get('username111')
return render(reqeust,'index.html',{'current_user': v}) def post(self,reqeust):
v = reqeust.COOKIES.get('username111')
return render(reqeust,'index.html',{'current_user': v})
   Templates
- 母版...html
                {% extends 'master.html' %}#  继承母版(子级只能继承一个母版)  master.html 为母版文件
{% block title %}xxxxx{% endblock %}# 在母版 设置 子级中对应 可添加子级的专属内容
include
{% include 'tag.html' %}#组件 tag.html为组件 (子级可以加入多个组件)
      - 自定义函数
simple_tag
a. app下创建templatetags目录
b. 任意xxoo.py文件
c. 创建template对象 register
- from django.utils.safestring import matk_safe
register=template.Library()
d.
@register.simple_tag
def func(a1,a2,a3....)
return "asdfasd"
e. settings中注册APP
f. 顶部 {% load xxoo %}
g. {% 函数名 arg1 arg2 %}
缺点:
不能作为if条件
优点:
参数任意
filter
a. app下创建templatetags目录
b. 任意xxoo.py文件
c. 创建template对象 register
d.
@register.filter
def func(a1,a2)
return "asdfasd"
e. settings中注册APP
f. 顶部 {% load xxoo %}
g. {{ 参数1|函数名:"参数二,参数三" }} {{ 参数1|函数名:数字 }}
缺点:
最多两个参数,不能加空格
优点:
能作为if条件 分页(自定义的分页) XSS:
{{ page_str|safe }} mark_safe(page_str)
    示例:
    views.py
 from  utils import pagination
LIST = []
for i in range(500):
LIST.append(i) def user_list(request):
current_page = request.GET.get('p', 1)#页面默认第一页
current_page = int(current_page)#转数字 val = request.COOKIES.get('per_page_count',10) #默认每页 10
print(val)
val = int(val)
page_obj = pagination.Page(current_page,len(LIST),val)#创建类对象 传入 当前页面数值 列表长度 每页显示记录数
#记录数据 开始记录数 结束记录数
data = LIST[page_obj.start:page_obj.end]# 数据记录进行切片取出 page_str = page_obj.page_str("/user_list/")#开始计算显示的页面 return render(request, 'user_list.html', {'li': data,'page_str': page_str})

  pagination.py

 __author__ = 'Administrator'
from django.utils.safestring import mark_safe class Page:
# 当前所在页面 记录条数统计 页面显示记录数 显示的页面数量
def __init__(self, current_page, data_count, per_page_count=10, pager_num=7):
self.current_page = current_page#当前当前所在页面
self.data_count = data_count#记录条数统计
self.per_page_count = per_page_count#页面显示记录数
self.pager_num = pager_num#显示的页面数量 #开始的记录数
@property#装饰后 不用加()
def start(self):
return (self.current_page - 1) * self.per_page_count #结束记录数
@property
def end(self):
return self.current_page * self.per_page_count #计算当前所有数据 需要的总页面数
@property
def total_count(self):
#商 余 商计算 记录条数统计 页面显示记录数
v, y = divmod(self.data_count, self.per_page_count)
if y:#如果有余数
v += 1#页面数需加1
return v #显示页面的方法函数 base_url为要跳转到的页面 ID
def page_str(self, base_url):
page_list = []#想要显示的页面列表
#当 所有的页面数 小于 想要显示的页面数
if self.total_count < self.pager_num:
#从第一页开始
start_index = 1
#到最后一页
end_index = self.total_count + 1 else:
##当前所在页面数 小于等于 想要显示的页面数的 +1 的一半 ( 总页面数 大于 想要显示的页面数 应对最前面的页面显示)
if self.current_page <= (self.pager_num + 1) / 2:
start_index = 1#第一页面
end_index = self.pager_num + 1#想要显示的页面
else:
#开始页面为选中页面的 前面几页(想要显示页面的+1的一半数, 选中页面保持中间位置 )
start_index = self.current_page - (self.pager_num - 1) / 2
end_index = self.current_page + (self.pager_num + 1) / 2
#如果 当前所在页面数 + 显示页面的 - 1 的一半 大于总页面数,(应对最后面的显示)
if (self.current_page + (self.pager_num - 1) / 2) > self.total_count:
start_index = self.total_count - self.pager_num + 1
end_index = self.total_count + 1 #如果当前为1时
if self.current_page == 1:
#上一页不再跳转
prev = '<a class="page" href="javascript:void(0);" rel="external nofollow" rel="external nofollow" >上一页</a>'
else:
prev = '<a class="page" href="%s?p=%s" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >上一页</a>' % (base_url, self.current_page - 1,)
page_list.append(prev)
#循环 开始显示页面 结束显示页面
for i in range(int(start_index), int(end_index)):
#如果所选中的页面,加CSS样式
if i == self.current_page:
temp = '<a class="page active" href="%s?p=%s" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >%s</a>' % (base_url, i, i)
else:
temp = '<a class="page" href="%s?p=%s" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >%s</a>' % (base_url, i, i)
page_list.append(temp)
#如果当前所在页面 等于 最后的页面
if self.current_page == self.total_count:
#下一页不再跳转
nex = '<a class="page" href="javascript:void(0);" rel="external nofollow" rel="external nofollow" >下一页</a>'
else:
nex = '<a class="page" href="%s?p=%s" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >下一页</a>' % (base_url, self.current_page + 1,)
page_list.append(nex)
#跳转页面 input框
jump = """
<input type='text' /><a onclick='jumpTo(this, "%s?p=");'>GO</a>
<script>
function jumpTo(ths,base){
var val = ths.previousSibling.value;
location.href = base + val;
}
</script>
""" % (base_url,) page_list.append(jump)#加入列表 page_str = mark_safe("".join(page_list))#拼接列表为长字符串 return page_str

user_list.html

 <!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
<style>
.pagination .page{
display: inline-block;
padding: 5px;
background-color: cyan;
margin: 5px;
}
.pagination .page.active{
background-color: brown;
color: white;
}
</style>
</head>
<body>
<ul>
{% for item in li %}
{% include 'li.html' %}
{% endfor %}
</ul> <div>
<select id="ps" onchange="changePageSize(this)">
<option value="10">10</option>
<option value="30">30</option>
<option value="50">50</option>
<option value="100">100</option>
</select>
</div> <div class="pagination">
{{ page_str }}
</div>
<script src="/static/jquery-1.12.4.js"></script>
<script src="/static/jquery.cookie.js"></script>
<script> $(function(){
{# var v = $.cookie('per_page_count', {'path': "/user_list/"});#}
var v = $.cookie('per_page_count');
$('#ps').val(v);
}); function changePageSize(ths){
var v = $(ths).val();
console.log(v);
$.cookie('per_page_count',v, {'path': "/user_list/"}); location.reload();
}
</script>
</body>
</html>
   cookie
客户端浏览器上的一个文件
 {"user": 'dachengzi'}         request.COOKIES.get('username111')#获取 COOKIES的内容         response = render(request,'index.html')
response = redirect('/index/')
# 设置cookie,关闭浏览器失效
response.set_cookie('key',"value") # 设置cookie, N秒只有失效
response.set_cookie('username111',"value",max_age=10) # 设置cookie, 截止时间失效
import datetime
current_date = datetime.datetime.utcnow()#现在的时间
current_date = current_date + datetime.timedelta(seconds=5)# 加上5秒
response.set_cookie('username111',"value",expires=current_date)# 等 于5 称后过期
response.set_cookie('username111',"value",max_age=10)

    					
相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,488
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,903
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,736
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,487
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:8,127
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:5,289