Python学习笔记Day18 - Django

快速开发组件

BootStrap (***最精美,模板多nifty)

- css
- js

学习 BootStrap 规则

一、响应式
    @media (min-width:900px){
        .c2{}
    }

二、图标、字体
    @font-face 指定图标字体文件
    使用时使用代号

三、基本使用
    导入js
    导入bootstrap
    css:{
        color:red !important;       #加!important表示不管先后顺序,一定会应用
    }
    bxslider轮播图,引用它的css和js,

========> 偏于后台管理

jQueryUI (*略推荐)

- css
- js

学习 jQueryUI 规则

EasyUI

- css
- js

在官网下easyUI包,查demo,复制源码,更改css,js链接
easyUI的源码和html代码不一致,不方便修改,不推荐

WEB框架

本质是socket

MVC:对文件夹分类
    Model     View       Controller
    数据库   模板文件    业务处理(函数)

MTV:
    Model    Template     View
    数据库   模板文件    业务处理

MVC、MTV,只是文件夹命名不同

Django

==用python开发web最齐全的框架=

基于MTV框架

http://www.cnblogs.com/wupeiqi/articles/5237704.html

1. 创建Django工程

  • 执行终端命令

      django-admin startproject 【工程名称】
    

    也可从Pycharm等IDE创建,不用重复此步骤,本质上都是自动执行上述命令

  • 其他常用命令:

      python manage.py runserver 0.0.0.0
      python manage.py startapp appname
      python manage.py syncdb
      python manage.py makemigrations
      python manage.py migrate
      python manage.py createsuperuser
    
  • 程序目录:

      【工程文件夹】
          - 【同名子文件夹】        # 对整个程序进行配置
              - init
              - settings  # 配置文件
              - wsgi      # 遵循WSIG规范,创建socket,uwsgi + nginx
              - url       # URL对应关系
                      def hello(request):
                          return HttpResponse('<div>hello</div>')
                      urlpatterns = [
                          path('s1/',hello)
                      ]
          - manage.py     # 管理Django程序:ORM对象
                              - python manage.py
                              - python manage.py startapp xx
                              - python manage.py makemigrations
                              - python manage.py migrate
    

2. 运行Django功能

python manage.py runserver 127.0.0.1:8001

3. 创建app文件夹

  • 配置文件夹

      cd 工程名
      python manage.py startapp xxxx....
    
  • app目录:

      migrations     数据修改表结构,每次表结构修改都会记录在一个文件中
      admin          Django为我们提供的后台管理功能(包括登录、权限管理、分组、搜索)
      apps           配置当前app
      models         ORM,写指定的类  通过命令可以创建数据库结构
      tests          单元测试
      views    ***   业务代码
    

4. 配置模板的路径

放置html,一般已自动创建        /./settings   
    TEMPLATES = [{
                'DIRS': [os.path.join(BASE_DIR, 'templates')],
            },]

5. 创建并配置静态目录

  • 创建/static,放置css,js,image等静态文件

      /./settings
      STATICFILES_DIRS = (
          os.path.join(BASE_DIR, 'static'),   # 不加逗号会报错
      )
    
  • 在html中导入css,js

      <link rel="stylesheet" href="/static/commons.css" />
    

6. 跨站请求伪造csrf禁用 (正式项目不需此步,但要在html中声明csrf_token)

/./settings
middlerware     # 注释 csrf

# 'django.middleware.csrf.CsrfViewMiddleware',

7. 定义路由规则url

/./url.py
1. 要在url里导入app 
2. path('home/',views.home),
    - url里可不加/,但要与引用处保持一致。
    - 建议加上,访问时没有则自动加/
  • Django生命周期:

      用户请求 ->> 路由 ->> 视图函数 ->> templates(html)、static(js,css)
                  url.py   app.views.py
    

8. 定义视图函数views

/app/views.py
    def func(request):
        request.method   GET / POST (大写)

    ========== GET 获取数据===========
        http://127.0.0.1:8009/home?nid=123&name=alex 
        request.GET.get('',None)   # 获取请求发来的数据,没有则返回none

    ========== POST 提交数据==========
        request.POST 包含用户提交的数据字典,以name字段为key
        request.POST.get('')

    ======== 返回数据 ========
        return HttpResponse('<div>hello</div>')   # 直接返回字符串,可解析成页面
        return render(request, "HTML模板的路径",{'形参': 实参})  # 获取html文件返回
        return redirect('只能填URL')              # 重定向
            - 也可填本地url:'/home'     前面的/代表本地的url前缀

9. 模板渲染

  • Django中特殊的模板语言

  • {{ 变量名 }}

      视图函数返回数据时将{{}}替换为相应的值
      return render(request, "index.html", {
                  'current_user': "alex",
                  'user_list': ['alex','eric']
                  'user_dict': {'k1': 'v1', 'k2': 'v2'}
                  })
      <html>
          <body>
              <div>{{current_user}}</div>
          </body>
      </html>
    
  • For循环

      {% for row in user_list %}
              <li>{{ row }}</li>
      {% endfor %}
    
      - 获取key
          {% for row in k2.keys %}
      - 获取value
          {% for row in k2.values %}
      - 获取key和value
          {% for k,v in k2.items %}
      - for循环里获取当前循环次数
          forloop.counter 索引,从 1 开始算
          forloop.counter0    索引,从 0 开始算
          forloop.revcounter  索引,从最大长度到 1
          forloop.revcounter0 索引,从最大长度到 0
          forloop.first   当遍历的元素为第一项时为真
          forloop.last    当遍历的元素为最后一项时为真
          forloop.parentloop.xxx  用在嵌套的 for 循环中,获取上层循环的 forloop
    
  • 用 "索引" 取列表(0)或字典(key)里的值

      <a> {{ user_list.0 }} </a>
      <a> {{ user_dict.k1 }} </a>
    
  • if条件判断

      {% if age %}
          <a>有年龄</a>
          {% if age > 16 %}
              <a>老男人</a>
          {% elif age < 3 %}
              ...
          {% else %}
              <a>小鲜肉</a>
          {% endif %}
      {% else %}
          <a>无年龄</a>
      {% endif %}
    
      ==, !=, >=, <=, >, < 
      and, or, not, in, not in 
      {%if value is None %}
    
  • 获取当前用户:

      {{ request.user }}
    
  • 如果登陆就显示内容,不登陆就不显示内容:

      {% if request.user.is_authenticated %}
          {{ request.user.username }},您好!
      {% else %}
          请登陆,这里放登陆链接
      {% endif %}
    
  • 获取当前网址:

      {{ request.path }}
    
  • 获取当前 GET 参数:

      {{ request.GET.urlencode }}     # keywords=131;time_filter=True
    
  • 获取referer

      request.META['HTTP_REFERER']
    

作业

XXXX管理:

SQLAlchemy

  • 主机管理表(8列):

      IP
      端口
      业务线
      ...
    
  • 用户表:

      用户名
      密码
    
  • 功能:

      1、登录
      2、主机管理页面
          - 查看所有的主机信息(4列)
          - 增加主机信息(8列) ** 模态对话框
      3、查看详细
          url:
              "detail" -> detail
    
          def detail(reqeust):
              nid = request.GET.get("nid")
              v = select * from tb where id = nid
              ...
      4、删除
          del_host -> delete_host
    
          def delete_host(request):
              nid = request.POST.get('nid')
              delete from tb where id = nid
              return redirect('/home')
    

博客

  • KindEditor

    • beautifulsoup4对标签进行过滤
    • 单例模式
  • 事务操作

    • from django.db import transaction
  • 筛选条件

    • 利用数据库内置函数实现筛选

作业:

- 示例
- 评论和点赞

pip3 install beautifulsoup4

问题

1. table文字不换行

- 给相应td添加 white-space:nowrap; 这个属性是设置文字强制不换行
- 或者在td内添加div标签,默认不换行

2. 设置STATIC_URL, STATICFILES_DIRS, STATIC_ROOT的区别

  • STATIC_URL='/static/'

    这个static 是在Django 具体APP下建立的static目录,用来存放静态资源。

  • STATIC_ROOT = os.path.join(BASE_DIR, 'collect_static') # BASE_DIR 是项目的绝对地址

    STATIC_ROOT 是在部署静态文件时(pyhtonmanage.pycollectstatic)所有的静态文静聚合的目录,STATIC_ROOT要写成绝对地址
    STATIC_ROOT 是在部署的时候才发挥作用,django会把所有的static文件都复制到STATIC_ROOT文件夹下

  • STATICFILES_DIRS=(os.path.join(BASE_DIR, "common_static"),) # 不加逗号会报错

    STATICFILES_DIRS 一般用来设置通用的静态资源,对应的目录不放在APP下,而是放在Project下,且非必须.
    STATICFILES_DIRS告诉django,首先到STATICFILES_DIRS里面寻找静态文件,其次再到各个app的static文件夹里面找
    (注意, django查找静态文件是惰性查找,查找到第一个,就停止查找了)

具体在模板文件中访问的时候,都是统一用:/static/资源名的方式,就可以访问到资源
不论具体的目录是APP下的static,还是project下的common_static, 都可以用/static/资源名的方式访问到。

为增强可移植性,在模板中可以用:STATIC_URL来代替具体的/static/来设置资源路径,但是需要在settings.py中2个地方进行设置,否则会发生取不到资源的错误:

INSTALLED_APPS 中,加入 'django.contrib.staticfiles'
TEMPLATES 中,context_processors中,加入django.template.context_processors.static

模板中调用时:

<img src="{{STATIC_URL}}pic.jpg " />

https://blog.csdn.net/jj546630576/article/details/78606531

3. 在Django中完整地删除一个App

  1. 删除models.py

    无论是删除一个单独的model还是删除整个App,都需要首先删除models.py文件中的模型。

    确认没有其他文件引用models.py中的类。

    迁移或者删除你的数据库,Django提供了简便的方法方便用户删除某App下的所有数据(Django 1.7)。

    python manage.py migrate app1 zero

    删除models.py中的数据模型。

  2. 删除App

    再次确认其他App中没有引用此App的文件

    删除整个App文件夹

    在settings.py的Installed Apps中移除该app。

4. 修改完数据后可直接用redirect刷新页面(属于get方式),比用render再传一次参数要方便

组合搜索

  1. 利用url传参给views里的kwargs,利用models.XX.filter筛选id

  2. 将当前kwargs传给模板,获取当前url,达成组合搜索

  3. 利用simpletag写小模板,将判断代码写在后台.py文件中

posted @ 2020-07-05 16:23  Jerome12138  阅读(140)  评论(0编辑  收藏  举报