10_常用技术

静态文件
  • js css 和 images 都是静态文件,一般把他们放在同一个文件夹中。
  • 流程
    • 新建目录:
      在这里插入图片描述

    • 配置,在settings.py中配置如下

      STATIC_URL = '/static/'  # 配置url路径
      STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')]  # 配置找到路径
      
    • 调用,html中
      <img src='/static/images/sg.png' />

    • 备注:

      • 如果把 STATIC_URL = '/abc/' 那么, <img src='/static/images/sg.png' /> 是找不到图片的,需要修改为 <img src='/abc/images/sg.png' />
      • 也就是说 <img src='/STATIC_URL/images/sg.png' /> , 而 STATICFILES_DIRS 是说的 项目下的static路径。
      • 动态配置,不用管你 STATIC_URL 地方设的是 static 还是 abc
        {% load static from staticfiles %}
        <img src="{% static "images/sg.png" %}" />
        
中间件
  • 引入:中间件就是一些django给你预留的函数接口,你可以在请求过程中修改一些东西。
  • 流程图
    在这里插入图片描述
  • 程序流程:
    • 新建一个中间件目录:
      在这里插入图片描述
    • 写中间件函数
      class TestMiddleware(object):
          '''中间件类'''
           def __init__(self, get_response):
              '''服务器重启之后,接受第一个请求时调用'''
              self.get_response = get_response
              print('-----init-------')
      
          def __call__(self, request):
              response = self.get_response(request)
              return response
      
          def process_request(self, request):
              '''产生request对象之后,url匹配之前调用'''
              print('-----process_request-------')
                 
      
          def process_view(self, request, view_func, *view_args, **view_kwargs):
              '''url匹配之后,视图函数调用之前调用'''
              print('-----process_view------')
      
          def process_response(self, request, response):
              '''视图函数调用之后,内容返回浏览器之前调用'''
              print('-----process_response-------')
              return response
      
    • 注册中间件项目的setting中
      在这里插入图片描述
  • 异常中间件在这里插入图片描述
    • 该异常是针对view中视图函数的异常的。
    • 异常中间件执行流程是从下往上,但是前面其他中间件的执行流程是从上往下。
Admin 管理
  • 新建一个地区类、关联、初始设置流程:
    • setting.py 中
      LANGUAGE_CODE = 'zh-hans'
      TIME_ZONE = 'Asia/Shanghai'
      
    • models 中:
      class AreaInfo(models.Model):
          '''地址模型类'''
          # (1)verbose_name 设置的是 admin 中 atitle 显示列名
          atitle = models.CharField(verbose_name='地区', max_length=20)
          aParent = models.ForeignKey('self', null=True, blank=True, on_delete=models.SET_NULL)
          # (2)__str__显示的是每个记录的名字,以前显示是objects
          def __str__(self):
              return self.atitle
          
          def title(self):
              return self.atitle
          title.admin_order_field = 'atitle'
          title.short_description = '地区名称'
          # (3)定义一个方法 计算一些数据,返回的是父级地区的名称
          def parent(self):
              if self.aParent is None:
                  return ''
              return self.aParent.atitle
          # (3)返回的列名称改为 '父级地区名称'
          parent.short_description = '父级地区名称'
      
    • admin.py 中:
      
       # (7)(3)针对一对多,当选中一后,同时显示多。
      class AreaStackedInline(admin.StackedInline):
          # 写多类的名字 快显示
          model = AreaInfo
          extra = 2
       # (7)(3)针对一对多,当选中一后,同时显示多。
      class AreaTabularInline(admin.TabularInline):
          # 写多类的名字 列表显示
          model = AreaInfo
          extra = 2  
      
      class AreaInfoAdmin(admin.ModelAdmin):
          list_per_page = 10
          # (3) 显示的那几列,'parent' 是model中areainfo中的方法名,计算后的结果
          list_display = ['id', 'atitle', 'title', 'parent']
          # (4)动作执行框放在上面还是下面
          actions_on_bottom = True
          actions_on_top = False
          # (5)右侧过滤框,并且写了按那些进行过滤
          list_filter = ['id', 'atitle']  # 过滤栏
          # (6)上侧搜索框,并且写了按那些进行搜索
          search_fields = ['id', 'atitle']
      
          # (7)(1) 编辑页字段排列顺序
          fields = ['aParent', 'atitle']
          # (7)(2)字段分组
           fieldsets = (
              ('基本', {'fields': ['atitle']}),
              ('高级', {'fields': ['aParent']}),
          )
          # (7)(3)针对一对多,当选中一后,同时显示多。
          # inlines = [AreaStackedInline]
          inlines = [AreaTabularInline]
      
      # Register your models here.
      # (7)前面模型类得需要注册,同时注册得还有上面 AreaInfoAdmin
      admin.site.register(AreaInfo, AreaInfoAdmin)
      
      
上传图片或者文件(以上传图片为例)
  • 在后台 admin 中上传图片
    在这里插入图片描述

  • 新建一个图片目录

    • setting 中配置路径
      MEDIA_ROOT = os.path.join(BASE_DIR, 'static/media')
    • 在models中写
      class PicTest(models.Model):
          '''上传图片'''
          goods_pic = models.ImageField(upload_to='booktest')
      
    • admin.py 中注册
      admin.site.register(PicTest)
    • 文件迁移
      python manage.py makemigrations
      python manage.py migrate
      • 备注:可能出的错如下:
        • 在数据表 django_migrations 中已经有了迁移记录,删除,delete from django_migrations where id = ...
        • 在迁移文件0001_initial.py中已经有了bookinfo的记录,可以把该部分注释掉。再python manage.py migrate
  • 在客户端上传文件

    • html中写模板如下:
      <form  method="post" action="/show_img" enctype="multipart/     form-data">
          {% csrf_token %}
          <input type="file" name="pic"><br />
          <input type="submit" value="上传">
      </form>
      <!--注意 enctype method csrf_token -->
      
    • 在 urls中
      re_path(r'^upload_img$', views.upload_img),
      re_path(r'^show_img$', views.show_img),
      
    • 在views中
      # 上传图片
      def upload_img(request):
          '''上传图片'''
          return render(request, 'booktest/uploade_img.html')
      
      from django.conf import settings
      from booktest.models import PicTest
      def show_img(request):
          '''上传图片点击提交之后的'''
          # 1. 获取上传文件的处理对象
          pic = request.FILES['pic']
          # 备注:
          #   1. 如果上传文件 小于等于 2.5m,则文件保存在内存中
          #   2. 如果上传文件 大于2.5m,则文件保存在临时文件中
          # 2. 创建一个文件
          save_path = '%s/booktest/%s' % (settings.MEDIA_ROOT, pic.name)
          with open(save_path, 'wb') as f:
              # 3. 获取上传文件的内容并写入到创建的文件中
              for content in pic.chunks():
                  f.write(content)
          # 4. 在数据库中保存上传记录
          PicTest.objects.create(goods_pic='booktest/%s' % pic.name)
          return HttpResponse('ok')
      
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值