zoukankan      html  css  js  c++  java
  • 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}}&nbsp;&nbsp;
    {%else%}
    <a href="/pag{{pindex}}/">{{pindex}}</a>&nbsp;&nbsp;
    {%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>
    ```
  • 相关阅读:
    vue --- 脚手架初始化项目中配置文件webpack.base.conf.js代码含义
    Chrome
    es8 --- 新特性
    es7 --- 新特性
    vue --- 关于多个router-view视图组件,渲染同一页面
    vue ---- 组件传值之间使用 v-model
    vue --- watch 高级用法
    js --- 递归结构图
    es6 --- Generator 函数
    es6 -- set 数据结构
  • 原文地址:https://www.cnblogs.com/xiaochuichui/p/13280563.html
Copyright © 2011-2022 走看看