zoukankan      html  css  js  c++  java
  • Django框架之-----其他技术补充

    其他技术

    • 1. 静态文件

    1.1 使用

     网页使用的css文件,js文件和图片叫做静态文件。

    1) 新建静态文件夹 static

     

    2) 配置静态文件所在的物理目录。Settings.py

    STATIC_URL = '/static/'
    ##  设置静态文件的物理目录
    STATICFILES_DIRS = [os.path.join(BASE_DIR,'static')]

    STATIC_URL设置访问静态文件对应的url

    STATICFILES_DIRS设置静态文件所在的物理目录。

    动态生成静态文件的路径。

    <!DOCTYPE html>
    {% load staticfiles %}
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>静态文件</title>
    </head>
    <body>
    <img src="/static/image/mm.jpg" alt="美女">
    
    <p>动态生成静态文件路径:</p>
    <img src="{% static 'image/mm.jpg' %}" alt="美女">
    </body>
    </html>
    动态生成静态文件的路径

    1.2 加载目录

    STATICFILES_FINDERS=('django.contrib.staticfiles.finders.FileSystemFinder', 'django.contrib.staticfiles.finders.AppDirectoriesFinder')

    顺序:先从项目中的static文件中找,找不到再去APP(应用中)的static文件中找

    • 2. 中间件

    中间件函数django框架给我们预留的函数接口让我们可以干预请求和应答的过程

     

    2.1 获取浏览器端的ip地址

    使用request对象的META属性:request.META['REMOTE_ADDR']

    2.2 使用中间件

    1) 新建middleware.py文件。

     

    2) 定义中间件类。

     

    在类中定义中间件预留函数。

    __init__:服务器响应第一个请求的时候调用。

    process_request:是在产生request对象,进行url匹配之前调用。

    process_view:是url匹配之后,调用视图函数之前。

    process_response:视图函数调用之后,内容返回给浏览器之前。

    process_exception:视图函数出现异常,会调用这个函数。

    如果注册的多个中间件类中包含process_exception函数的时候,调用的顺序跟注册的顺序是相反的。

    3) 注册中间件类。

     

    • 3. Admin后台管理

    3.1 使用

    1) 本地化。语言和时区本地化。

    2) 创建超级管理员。

    python mange.py createsuperuser

    3) 注册模型类。

    4) 自定义管理页面。

    自定义模型管理类。

    注册模型类的时候给register函数添加第二个参数,就是自定义模型管理类的名字。

     1 class AreaInfo_Admin(admin.ModelAdmin):
     2     '''地区模型类'''
     3     ##  指定每页显示10条数据
     4     list_per_page = 10
     5     list_display = ['id','atitle','title']##    调用title这个方法
     6 
     7     ##  给管理页面底部增加删除按钮
     8     actions_on_bottom = True
     9 
    10     ##  删除管理页面顶部的删除按钮
    11     actions_on_top = False
    12 
    13     ##  列表页右侧过滤栏
    14     list_filter = ['aParent']
    15 
    16     ##  列表页上方的搜索框
    17     search_fields = ['atitle']
    管理类(admin)方法
     1 class AreaInfo(models.Model):
     2     '''地区模型类'''
     3     ##      地区名
     4     atitle = models.CharField(verbose_name='地区名',max_length=20)    ##  修改管理页面atitle的默认标题,改为地区名
     5     ##      关联属性,代表父级地区,自关联
     6     aParent = models.ForeignKey('self',null=True,blank=True,on_delete='CASCADE')
     7 
     8     def title(self):
     9         ##  定义方法,让管理类调用
    10         return self.atitle
    11     ##  将title这个方法变为可选,按atitle排序
    12     title.admin_order_field = 'atitle'
    13 
    14     ##  改变管理页面title标题的显示方式,改为中文
    15     title.short_description = '地区名称'
    模型类方法

    3.2 模型管理类相关属性

    1) 列表页相关的选项。

     

        

     

     

     

     

     

     

     

     

     

    2) 编辑页相关的选项。

     

     

     

     

     

     

     

    • 4. 上传图片

    商品销售网站。

    4.1 配置上传文件保存目录

    1) 新建上传文件保存目录。

     

    2) 配置上传文件保存目录。

     

    4.2 后台管理页面上传图片

    1) 设计模型类。

     

    2) 迁移生成表格。

     

    3) 注册模型类。

    4.3 用户自定义页面上传图片

    1) 定义用户上传图片的页面并显示,是一个自定义的表单。

     

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>上传页面</title>
    </head>
    <body>
    <form action="/upload_handle" method="post" enctype="multipart/form-data">
        {% csrf_token %}
        <p><input type="file" name="pic"></p>
        <p><input type="submit" value="提交"></p>
    </form>
    
    
    </body>
    </html>
    show_upload.html

    2) 定义接收上传文件的视图函数。

    request对象有一个FILES的属性,类似于字典,通过request.FILES可以获取上传文件的处理对象

    django中,上传文件不大于2.5M,文件放在内存中。上传文件大于2.5M,文件内容写到一个临时文件中。

    Django处理上传文件的两个类:

    FILE_UPLOAD_HANDLERS= ("django.core.files.uploadhandler.MemoryFileUploadHandler",

      "django.core.files.uploadhandler.TemporaryFileUploadHandler")

     1 def upload_handle(request):
     2     '''上传图片处理'''
     3     ##  1、接收上传的图片
     4     pic = request.FILES['pic']  ##  这个一个对象
     5     pic_name = pic.name     ##  图片的名字
     6     # pic.chunks()    ##  图片内容,是一个迭代器
     7 
     8     ##  2、打开一个static/media/booktest的文件
     9     save_path = '%s/booktest/%s'%(settings.MEDIA_ROOT,pic_name)
    10 
    11     ##  3、写入图片
    12     with open(save_path,'wb') as f:
    13         for context in pic.chunks():
    14             f.write(context)
    15 
    16     ##  4、往数据库保存记录
    17     Pictest.objects.create(goods_pic='booktest/%s'%pic_name)
    18 
    19     ##  5、返回应答
    20     return HttpResponse('ok')
    自定义上传图片的视图函数

    上传图片参考资料:

    1. http://python.usyiyi.cn/documents/django_182/topics/http/file-uploads.html
    2. http://python.usyiyi.cn/documents/django_182/ref/files/uploads.html#django.core.files.uploadedfile.UploadedFile
    • 5. 分页

    查询出所有省级地区的信息,显示在页面上。

    AeroInfo.objects.filter(aParent__isnull = True)

    1) 查询出所有省级地区的信息。

    2) 按每页显示10条信息进行分页,默认显示第一页的信息,下面并显示出页码。

    3) 点击i页链接的时候,就显示第i页的省级地区信息。

    from django.core.paginator import Paginator

    paginator = Paginator(areas, 10) #按每页10条数据进行分页

    Paginator类对象的属性:

    属性名

    说明

    num_pages

    返回分页之后的总页数

    page_range

    返回分页后页码的列表

    Paginator类对象的方法:

    方法名

    说明

    page(self, number)

    返回第number页的Page类实例对象

     

    Page类对象的属性:

    属性名

    说明

    number

    返回当前页的页码

    object_list

    返回包含当前页的数据的查询集

    paginator

    返回对应的Paginator类对象

     

    Page类对象的方法:

    属性名

    说明

    has_previous

    判断当前页是否有前一页

    has_next

    判断当前页是否有下一页

    previous_page_number

    返回前一页的页码

    next_page_number

    返回下一页的页码

     1 from django.core.paginator import Paginator
     2 ##  /show_area(d*)
     3 def show_area(request,pindex):
     4     '''显示省级地区'''
     5     ##  获取省级地区
     6     areas = AreaInfo.objects.filter(aParent__isnull=True)
     7     ##  分页,每页显示10条
     8     paginator = Paginator(areas,10)
     9     ##  判断pindex是否为空
    10     if pindex == '':
    11         pindex = 1
    12     else:
    13         pindex = int(pindex)
    14 
    15     ##  获取第一页的内容
    16     ##  page是Page类的实例对象
    17     page = paginator.page(pindex)
    18 
    19     ##  返回应答
    20     # return render(request,'booktest/show_area.html',{'areas':areas})
    21     return render(request,'booktest/show_area.html',{'page':page})
    分页的视图函数
     1 <!DOCTYPE html>
     2 <html lang="en">
     3 <head>
     4     <meta charset="UTF-8">
     5     <title>分页</title>
     6 </head>
     7 <body>
     8 <ul>
     9     {% for area in page.object_list %}
    10         <li>{{ area.atitle }}</li>
    11     {% endfor %}
    12 </ul>
    13 
    14 <ul>
    15     {% if page.has_previous %}
    16         <a href="/show_area{{page.previous_page_number}}">上一页</a>
    17     {% endif %}
    18     {% for pindex in page.paginator.page_range %}
    19         {% if pindex == page.number %}
    20             {{ pindex }}
    21         {%else%}
    22             <a href="/show_area{{ pindex }}">{{ pindex }}</a>
    23         {% endif %}
    24     {% endfor %}
    25     {% if page.has_next %}
    26         <a href="/show_area{{page.next_page_number}}">下一页</a>
    27     {% endif %}
    28 </ul>
    29 
    30 </body>
    31 </html>
    分页的模板文件

    分页参考资料:

    http://python.usyiyi.cn/translate/django_182/topics/pagination.html

    • 6. 省市选择案例

    1) 显示省地区信息。

    $.get('/prov', function(data){

    })

    2) 省改变时在对应的下拉列表框中显示下级市的信息。

    $.get('/city?pid='+pid, function(data){

    })

    request.GET.get(‘pid’)

    或者:

    $.get('/city'+$(this).val(), function(data){

    })

    3) 市改变时在对应的下拉列表框中显示下级县的信息。

    $.get('/dis?pid='+pid, function(data){

    })

    或者:

    $.get('/dis'+$(this).val(), function(data){

    })

     1 def areas(request):
     2     '''省市县选择框'''
     3     return render(request,'booktest/areas.html')
     4 
     5 def prov(request):
     6     '''省份ajax处理'''
     7     ##  1、获取所有的省份
     8     provs = AreaInfo.objects.filter(aParent__isnull=True)
     9 
    10     ##  2、将所有的省份遍历
    11     prov_lists = []
    12     for prov in provs:
    13         prov_list = [prov.id,prov.atitle]
    14         prov_lists.append(prov_list)
    15 
    16     ##  json系列化发送
    17     return JsonResponse({'data':prov_lists})
    18 
    19 def city(request,prov_id):
    20     '''市级ajax处理'''
    21     ##  1、获取所有的市
    22     ##  第一种获取方式
    23     # prov = AreaInfo.objects.get(id=prov_id)
    24     # citys = prov.areainfo_set.all()
    25     ##  第二种方式
    26     citys = AreaInfo.objects.filter(aParent__id=prov_id)
    27 
    28     ##  2、将所有市举行遍历
    29     city_lists = []
    30     for city in citys:
    31         city_list = [city.id,city.atitle]
    32         city_lists.append(city_list)
    33 
    34     ##  3、json序列化发送
    35     return JsonResponse({'data':city_lists})
    36 
    37 def county(request,city_id):
    38     '''县级ajax处理'''
    39     ##  1、获取所有的县
    40 
    41     countys = AreaInfo.objects.filter(aParent__id=city_id)
    42 
    43     ##  2、将所有市举行遍历
    44     county_lists = []
    45     for city in countys:
    46         county_list = [city.id,city.atitle]
    47         county_lists.append(county_list)
    48 
    49     ##  3、json序列化发送
    50     return JsonResponse({'data':county_lists})
    视图函数
    1 from django.conf.urls import url
    2 from booktest import views
    3 
    4 urlpatterns = [
    5     url(r'^areas$',views.areas),##  显示省市县
    6     url(r'^prov$',views.prov),##    省级获取ajax
    7     url(r'^city(?P<prov_id>d+)$',views.city),##    市级获取ajax
    8     url(r'^county(?P<city_id>d+)$',views.county),##    市级获取ajax
    9 ]
    url配置
     1 <!DOCTYPE html>
     2 <html lang="en">
     3 <head>
     4     <meta charset="UTF-8">
     5     <title>省市县选择</title>
     6 </head>
     7 <body>
     8 
     9 <select name="prov" id="prov">
    10     <option>--请选择省份--</option>
    11 </select>
    12 <select name="city" id="city">
    13     <option>--请选择市--</option>
    14 </select>
    15 <select name="county" id="county">
    16     <option>--请选择县--</option>
    17 </select>
    18 
    19 </body>
    20 <script src="/static/js/jquery-3.5.0.min.js"></script>
    21 <script>
    22     //ajax请求方式:get
    23      $.get('/prov', function (data) {
    24 
    25          var prov_lists = data['data'];
    26 
    27          //第二种遍历方式:each
    28          $(prov_lists).each(function () {
    29              var pro_option = $('<option>');
    30              pro_option.html($(this)[1]).val($(this)[0]);
    31              $('#prov').append(pro_option);
    32          });
    33 
    34      });
    35 
    36 
    37   // 获取省下面的市
    38      $('#prov').change(function () {
    39          // 清空市和县
    40          $('#city').empty().append('<option>--请选择市--</option>');
    41          $('#county').empty().append('<option>--请选择县--</option>');
    42          // 捕获该省级的id
    43          var prov_id = $(this).val();
    44          //ajax请求方式:get     /city(d+)
    45          $.get('/city' + prov_id, function (data) {
    46              var city_lists = data['data'];  //获取city的列表
    47              $(city_lists).each(function () {
    48                  var city_option = $('<option>');
    49                  city_option.html($(this)[1]).val($(this)[0]);
    50                  $('#city').append(city_option);
    51              });
    52 
    53          });
    54      });
    55 
    56 
    57 
    58    // 获取市下面的县
    59      $('#city').change(function () {
    60          // 清空#prov 的所有子标签
    61          $('#county').empty().append('<option>--请选择县--</option>');
    62          // 捕获该市级的id
    63          var city_id = $(this).val();
    64          //ajax请求方式:get     /city(d+)
    65          $.get('/county' + city_id, function (data) {
    66              var county_lists = data['data'];  //获取county的列表
    67              $(county_lists).each(function () {
    68                  var county_option = $('<option>');
    69                  county_option.html($(this)[1]).val($(this)[0]);
    70                  $('#county').append(county_option);
    71              });
    72          });
    73      });
    74 
    75 </script>
    76 </html>
    模板文件
  • 相关阅读:
    03 Spring框架 bean的属性以及bean前处理和bean后处理
    02 Spring框架 简单配置和三种bean的创建方式
    01 Spring框架 基本介绍
    Struts2学习---拦截器+struts的工作流程+struts声明式异常处理
    js 正则表达式
    HTTP中GET与POST的区别 (本质上是一样一样的TCP链接)
    微信商户平台的“企业付款到用户” 产品功能被隐藏起来了。。
    软件的安装及下载
    phpstorm 使用技巧
    Socket.io和Redis写Realtime App 之express初试
  • 原文地址:https://www.cnblogs.com/maoxinjueluo/p/12776457.html
Copyright © 2011-2022 走看看