Django高级扩展
静态文件:
css,js,图片,Json文件,字体文件等......
配置settings.py:
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static')
]
<script type="text/javascript" src="/static/myApp/js/JQuery.js"></script>
<img src="{% static 'myApp/img/1.jpg' %}">
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'myApp/templates')],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
'builtins': [
'django.templatetags.static'
],
},
},
]
中间件:
概述:一个轻量级、底层的插件,可以介入Django的请求和相应
本质:一个Python类
方法:
__init()__:不需要传参数,服务器相应第一个请求时,自动调用,用于确定是否启用该中间件
process_request(self,request):
在执行视图之前被调用(分配url匹配视图 ),返回None或者HttpResponse对象
process_view(self,request,view_func,view_args,view_kwargs):
调用视图之前执行,每个请求都会调用,返回None或者HttpResponse对象
process_template_response(self,request, response):
在试图刚好执行完后调用,每个请求都会调用,返回None或者HttpResponse对象
使用render
process_response(self,request, response):
所有的响应返回浏览器之前调用,每个请求都会调用,返回HttpResponse对象
process_exception(self,request, exception):
当视图抛出异常时调用,返回HttpResponse对象
自定义中间件:
在工程目录下middleware目录下创建myAPP目录
创建一个python文件
from django.utils.deprecation import MiddlewareMixin
class MyMiddle(MiddlewareMixin):
def process_request(self, request):
print("get参数为:", request.GET.get("attribute"))
使用自定义中间件:
配置settings.py文件:
在MIDDLEWARE中添加:middleware.myApp.myMiddle.MyMiddle
上传图片:
概述:
文件上传时,文件数据存储在request.FILES属性中,必须是post请求
存储路径:在static目录中创建upfile目录用于存储接收上传的文件
配置settings.py:< MEDIA_ROOT = os.path.join(BASE_DIR, r'static\upfile') >
示例:
<form method="post" action="/savefile/" enctype="multipart/form-data">
<input type="file" name="file">
<input type="submit" value="上传">
{% csrf_token %}
</form>
import os
from django.conf import settings
def savefile(request):
if request.method == "POST":
file = request.FILES['file']
filepath = os.path.join(settings.MEDIA_ROOT, file.name)
with open(filepath, 'wb') as fp:
for info in file.chunks():
fp.write(info)
return HttpResponse("上传成功")
else:
return HttpResponse("上传失败")
分页:
Paginator对象:
创建对象:
格式:Paginator(列表,整数)
返回值:返回一个分页对象
属性:
count:对象总数
num_pages:页面总数
num_range:页面列表,页码从1开始
方法:
page(num):获得Page对象,如果提供的页码不存在,会抛出"InvalidPage"异常
异常:
invalidPage:当向page()传递的是一个无效的页码时抛出
PageNotAnInteger:当向page()传递的不是一个整数时
EmptyPage:当向page()传递一个有效值,但是该页面无数据时抛出
Page对象:
创建对象:Paginator对象的age()方法得到Page对象
不需要手动创建
属性:
object_list:当前页上所有的数据(对象)列表
number:当前页码的页码值
paginator:当前page关联的paginator对象
方法:
has_next():判断是否有下一页,如果有返回True
has_previous():判断是否有上一页,如果有返回True
has_other_pages():判断是否有上一页或下一页,如果有返回True
next_page_number():返回下一页的页码,如果下一页不存在,抛出InvalidPage异常
previous_page_number():返回上一页的页码,如果上一页不存在,抛出InvalidPage异常
len():返回当前页的数据(对象)的个数
示例:
stulist = Students.objects.all()
paginator = Paginator(stulist, 5)
page = paginator.page(pageid)
return render(request, 'myApp/index.html', {"stu": stu, "stulist": page})
<ul>
{% for i in stulist %}
{% if forloop.counter|divisibleby:2 %}
<li style="color: red">
<label>{{forloop.counter}}</label>
<label>姓名:</label>{{i.sName}}
<label>年龄:</label>{{i.sAge}}
<label>个人介绍:</label>{{i.sContend}}
</li>
{% else %}
<li style="color: green">
<label>{{forloop.counter}}</label>
<label>姓名:</label>{{i.sName}}
<label>年龄:</label>{{i.sAge}}
<label>个人介绍:</label>{{i.sContend}}
</li>
{% endif %}
{% empty %}
<label>目前没有学生</label>
{% endfor %}
</ul>
<ul>
{% for index in stulist.paginator.page_range %}
{% if index == stulist.number %}
<li style="float: left;list-style: none">
<a href="javascript:volid(0);">{{index}}</a>
</li>
{% else %}
<li style="float: left;list-style: none">
<a href="{% url 'myApp:index2' index %}">{{index}}</a>
</li>
{% endif %}
{% endfor %}
</ul>
Ajax:
需要动态生成,请求JSON数据
from django.http import JsonResponse
from django.core import serializers
def studentinfo(request):
stus = Students.objects.values()
json_data = list(stus)
return JsonResponse(json_data, safe=False)
$(document).ready(function() {
$("#btn").click(function () {
$.ajax({
type : "get",
url : "/studentinfo/",
dateType : "json",
success:function (data, status) {
for (let i = 0; i < data.length; i++) {
//document.write('<label>'+element[j]+'</label>')
let element = data[i];
for (let key in element){
document.write('<label>'+element[key]+'</label>')
}
document.write('<br>')
}
}
})
});
})
富文本:
安装< django-tinymce >
在站点中使用:
配置settings.py文件:
INSTALLED_APPS添加 ‘tinymce’
TINYMCE_DEFAULT_CONFIG = {
'theme': 'advanced',
'width': 600,
'height': 400,
}
创建一个模型类:
from tinymce.models import HTMLField
class Text(models.Model):
str = HTMLField()
配置站点:
from .models import Text
admin.site.register(Text)
在自定义视图中使用:
<script type="text/javascript" src="/static/tiny_mce/tiny_mce.js"></script>
<script type="text/javascript">
tinyMCE.init({
'mode':'textareas',
'theme':'advanced',
'width':800,
'height':600
})
</script>
<textarea name="str">爱我中华</textarea>