Django 第六天

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>

# 使用标签的方式
# 在HTML页面头部引入{% load static %} 
<img src="{% static 'myApp/img/1.jpg' %}">
# 或者在settings.py的TEMPLATES中加入‘builtins’里面的内容 这样就可以不用每次在HTML头部引入标签了
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):
    # 方法一 把对象转化为JSON
    # stus = Students.objects.values()
    # json_data = list(stus)
    # json_data = json.dumps(json_data, cls=DateEncoder, ensure_ascii=False)
    # return HttpResponse(json_data)
    # 方法二 把对象转化为JSON
    stus = Students.objects.values()
    json_data = list(stus)

    return JsonResponse(json_data, safe=False)

# js获取json的值
$(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>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值