django虚拟环境与文件上传
创建可以循环使用的虚拟环境 ###### 1安装virtualenv - pip install virtualenv ###### 2 .使用--no-site-packages - virtualenv --no-site-packages djangoenv - 进入虚拟环境激活虚拟环境 命令:source activate ###### 3检查pip已经安装过哪些包 - pip freeze:查看pip安装过的包 - pip list:查看所有安装过的包 ###### 4.安装需要用的库 - pip install django==1.11 - pip install pymysql ###### 5.创建项目并且运行 1. 创建项目 django-amdin startproject day1 2. 创建app python manage.py startapp app 3. 启动服务器 python manage.py runserver ###### 6.配置MySQL - 进入项目下的init文件中 **import pymysql** **pymysql.install_as_MySQLdb()** ###### 7.配置setting和其他文件 ------------------- ##### URL反向解析 1. **在url文件中配置namespace**. **在应用下面的url文件中配置name** **src = '/app/left/'** **src = "{% url 'namespace:name' %}"** ----- ###### 静态解析 **针对静态url加载css/js等等** 需要在setting文件中配置 ``` # Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/1.11/howto/static-files/ STATIC_URL = '/static/' STATICFILES_DIRS = [os.path.join(BASE_DIR,'static'),] ``` ``` <img src='/statc/img/xxx.css'> 加载静态内容 {% load static %} <img src='{% static "img/xxx.css" %}'> ``` --- ###### 网页过滤器[ | ] **常见的有** ``` lower upper date:y-m-d h:m:s 时间格式化显示 add:1 add:-1 ``` ##### QueryDict对象 - 定义在django.http.QueryDict - request对象的属性GET、POST都是QueryDict类型的对象 - 与python字典不同,QueryDict类型的对象用来处理同一个键带有多个值的情况 - 方法get():根据键获取值 - 只能获取键的一个值 - 如果一个键同时拥有多个值,获取最后一个值 ``` dict.get('键',default) 或简写为 dict['键'] ``` - 方法getlist():根据键获取值 - 将键的值以列表返回,可以获取一个键的多个值 ``` dict.getlist('键',default) ``` ###### 获取数据的时候get和filter的区别 get 一定要确定能获取到唯一一个对象 filter 能获取很多对象,获取的数据是一个queryset filter可以做下面的操作: first():获取第一个 [:1] last():获取最后一个 --- ##### django中的分页 - Django的提供了一些类实现管理数据分页,这些类位于Django的/核心/ paginator.py中 **需要导入Paginator** ``` from django.core.paginator import Paginator ``` ###### Paginator对象 - Paginator(列表,int):返回分页对象,参数为列表数据,每面数据的条数 ###### 属性 - count:对象总数 - num_pages:页面总数 - page_range:页码列表,从1开始,例如[1, 2, 3, 4] ###### 方法 - page(num):下标以1开始,如果提供的页码不存在,抛出InvalidPage异常 ###### 异常exception - InvalidPage:当向page()传入一个无效的页码时抛出 - PageNotAnInteger:当向page()传入一个不是整数的值时抛出 - EmptyPage:当向page()提供一个有效值,但是那个页面上没有任何对象时抛出 ###### Page对象 ###### 创建对象 - Paginator对象的page()方法返回Page对象,不需要手动构造 ###### 属性 - object_list:当前页上所有对象的列表 - number:当前页的序号,从1开始 - paginator:当前page对象相关的Paginator对象 ###### 方法 - has_next():如果有下一页返回True - has_previous():如果有上一页返回True - has_other_pages():如果有上一页或下一页返回True - next_page_number():返回下一页的页码,如果下一页不存在,抛出InvalidPage异常 - previous_page_number():返回上一页的页码,如果上一页不存在,抛出InvalidPage异常 - len():返回当前页面对象的个数 - 迭代页面对象:访问当前页面中的每个对象 ###### 示例 ###### 创建视图pagTest ``` from django.core.paginator import Paginator def pagTest(request, pIndex): list1 = AreaInfo.objects.filter(aParent__isnull=True) p = Paginator(list1, 10) if pIndex == '': pIndex = '1' pIndex = int(pIndex) list2 = p.page(pIndex) plist = p.page_range return render(request, 'booktest/pagTest.html', {'list': list2, 'plist': plist, 'pIndex': pIndex}) ``` ###### 配置url ``` url(r'^pag(?P<pIndex>[0-9]*)/$', views.pagTest, name='pagTest'), ``` ###### 定义模板pagTest.html ``` <!DOCTYPE html> <html> <head> <title></title> </head> <body> <ul> {%for area in list%} <li>{{area.id}}--{{area.atitle}}</li> {%endfor%} </ul> {%for pindex in plist%} {%if pIndex == pindex%} {{pindex}} {%else%} <a href="/pag{{pindex}}/">{{pindex}}</a> {%endif%} {%endfor%} </body> </html> ``` ###### 上传文件 **首先django中需要安装:pip install Pillow** 修改form表单提交的属性为enctype="multipart/form-data" ``` <form action="" method="post" enctype="multipart/form-data"> </form> ``` 提交的时候使用request.FILES.get()去获取数据 ``` s_img = request.FILES.get('s_img') #或者 s_img = request.FILES['s_img] ``` 设置setting加载media路径 ``` #media路径 MEDIA_URL = '/media/' MEDIA_ROOT = os.path.join(BASE_DIR,'media') ``` 在url中加载路径 ``` #把media做成静态目录 urlpatterns += static(MEDIA_URL,document_root = MEDIA_ROOT) ``` 页面显示的路径 ``` <td><img src="/media/{{ page.s_img }}" width='50' height="50"></td> ```
心之所向无人可挡