静态文件
- 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)
- setting.py 中
上传图片或者文件(以上传图片为例)
-
在后台 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
- 在数据表
- 备注:可能出的错如下:
- setting 中配置路径
-
在客户端上传文件
- 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')
- html中写模板如下: