Django 过滤器

 

1.Django的命令:

  1. 下载

    1. pip install django==1.11.16

    2. pip install django==1.11.16 -i 源

  2. 创建项目

    1. django-admin startproject 项目名 

  3. 启动项目

    1. cd 项目目录下  找到manage.py

    2. python manage.py runserver  # 127.0.0.1:8000

    3. python manage.py runserver 80 # 127.0.0.1:80

    4. python manage.py runserver  0.0.0.0:80 # 0.0.0.0:80

  4. 创建一个APP

    1. python manage.py startapp  app名称

    2. 注册  

  5. 数据库迁移

    1. python manage.py makemigrations   # 在app下的migrations文件夹下记录 models的变更记录

    2. python manage.py migrate    # 将models的变更记录同步到数据库中

2.Django的配置

  1. 注释一个CSRF的中间件    可以提交POST 

  2. databases 数据库

    1. ENGINE  :  mysql

    2. NAME : 数据库的名称

    3. HOST:主机的IP

    4. PORT:3306

    5. USER: 用户名

    6. PASSWORD: 密码

  3. 静态文件的配置

    1. STATIC_URL  = '/static/'   # 别名 

    2. STATICFILES_DIRS = [

      ​ os.path.join(BASE_DIR,'static')

      ]

  4. app

    1. INSTALLED_APPS = [

      ​ 'app01' ,

      ​ 'app01.apps.App01Config'

      ]

  5. TEMPLATES 模板相关的配置

    1. DIRS  [ os.path.join(BASE_DIR,'templates')]

3.Django使用mysql数据库的流程:

  1. 创建一个mysql数据库

  2. 在settings中进行配置

    DATABASES = {
       'default': {
           'ENGINE': 'django.db.backends.mysql',
           'NAME': 'bookmanager',
           'HOST': '127.0.0.1',
           'PORT': 3306,
           'USER': 'root',
           'PASSWORD': '',

      }
    }
  3. 在与settings同级目录下的init的文件中写:


    import pymysql
    pymysql.install_as_MySQLdb()
  4. 在app下的models中写类(models.Model)


    class Publisher(models.Model):  # app01_publisher
       pid = models.AutoField(primary_key=True)  # pid 主键
       name = models.CharField(max_length=32, unique=True)  # 出版社名称

       def __str__(self):
           return self.name


    class Book(models.Model):
       title = models.CharField(max_length=32, unique=True)  # 书籍的名称
       publisher = models.ForeignKey('Publisher', on_delete=models.CASCADE)  # 关联了出版社

       def __str__(self):
           return self.title


    class Author(models.Model):
       name = models.CharField(max_length=32, unique=True)  # 作者的名字
       books = models.ManyToManyField('Book')  # 表示作者和书籍 多对多的关系
       # books = models.ManyToManyField('Book', through='Author_book',) # 表示作者和书籍 多对多的关系

       def __str__(self):
           return self.name

    5.数据库迁移的命令

    1. python manage.py makemigrations   # 在app下的migrations文件夹下记录 models的变更记录

    2. python manage.py migrate    # 将models的变更记录同步到数据库中

4.ORM的对应关系

​ 类     —— 》  表

​ 对象  ——》 记录(数据行)

​ 属性  ——》 字段

5.ORM操作

  1. 查询

    1. models.Publisher.objects.all()      # 查询所有的数据   ——》 QuerySet   对象列表

    2. models.Publisher.objects.get()    # 获取满足条件的一个对象    ——》 单独的对象

    3. models.Publisher.objects.filter()   # 获取满足条件的所有对象  ——》对象列表

    4. models.Publisher.objects.all().order_by('id')   # 排序  —— 》 对象列表

    5. pub_obj.pk    ——》 主键

    6. pub_obj.name 

    7. 外键

      1. book_obj.publisher    ——》 关联的对象

      2. book_obj.publisher_id  ——》从book表中获取关联对象的ID

      3. book_obj.publisher.name    ——》 关联的对象的属性

    8. 多对多

      1. author_obj.books   ——》 管理对象

      2. author_obj.books.all()   ——》 关联的所有的对象  对象列表

      3. book_obj.author_set   ——》管理对象、

  2. 增加

    1. models.Publisher.objects.create(name='xxx')    ——》 对象

    2. 外键

      1. models.Book.objects.create(title='xxx',publisher=pub_obj)

      2. models.Book.objects.create(title='xxx',publisher_id=pub_obj.id)

    3. 多对多

      1. models.Author.objects.create(name='xxxx')  ——》 author_obj

      2. author_obj.books.set([多个要关联对象的id,])

      3. author_obj.books.set([多个要关联对象,])

  3. 删除

    1. models.Author.objects.get(id=1).delete()

    2. models.Author.objects.filter(id=1).delete()

  4. 修改

    1. pub_obj.name = 'new_xxxx'

    2. pub_obj.save()

    3. 外键

      1. book_obj.title = 'xxxx'

      2. book_obj.publisher = pub_obj  或者  book_obj.publisher_id = pub_obj .id

      3. book_obj.save()

    4. 多对多

      1. author_obj.name = 'new_name'  

      2. author_obj.save()

      3. author_obj.books.set([多个要关联对象,])   author_obj.books.set([多个要关联对象的id,])

6.request

  1. request.method    ——》 请求方式    8 种    GET/POST

  2. request.GET           ——》 url上的参数  xxxx/?id=1&name=aelex   {}    [] request.GET.get('id')

  3. request.POST        ——》 form表单提交的POST的数据   {}    []  request.POST.get()

7.函数的返回值

  1. HttpResponse('字符串') ——》  返回字符串

  2. render(request,'模板的文件名',{k1:v1})     ——》返回一个完整的页面

  3. redirect(''跳转的地址'')     ——》 重定向   响应头  Location : '跳转的地址'

 

1.MVC和MTV
  1. MVC

  2. C  Controller  :  逻辑的控制 

  3. M Model     :     存取数据

  4. V View       :  信息的展示

  5. MTV

    1. M : model    ORM操作

    2. T:     Template   模板

    3. V:  View     业务逻辑

2.变量

{{ 变量 }}   使用.来获相关属性和方法

3.过滤器

语法: {{ value|filter_name:参数 }}   # 参数最多只有一个

  1. 内置过滤器

    1. default  提供默认值

      {{ kong|default:'nothing' }}  

    2. date  日期格式化


      {{ now|date:'Y-m-d H:i:s' }}

      settings中可配置全局的日期时间格式化
      USE_L10N = False
      DATETIME_FORMAT = 'Y-m-d H:i:s'
    3. safe 不进行转义


      {{ js|safe }}   # 告诉Django 前面的内容是安全的,不必转义
  2. 自定义filter

    1. 定义

      1. 在APP下创建一个叫templatetags的python包;  不能变的,必须是包,名字必须是templatetags

      2. 在包中创建一个py文件     my_filters;

      3. 在py文件中写代码


        from django import template
       
        register = template.Library()  # register的名字不能改
      1. 写函数


      @register.filter
      def add_dsb(value, arg):
         return "{}_{}".format(value, arg)
      1. 给定义的函数加装饰器


      @register.filter
      def add_dsb(value, arg):
    2. 使用

      在模板中使用:

      1. 导入定义的文件


        {% load my_filter %}
      1. 使用过滤器


      {{ name|add_dsb:'very_dsb' }}

4.标签

​ {% csrf_token %}

​ 添加在form表单中   就可以提交POST请求

5.母版和继承
  1. 母版

    就是一个普通的HTML文本,将多个页面公共部分的内容提取出来,在页面中定义多个block块


    {% block content %}
    {% endblock %}
    1. 继承

    在子页面中,继承母版  {% extends  'base.html'  %}

    可以重新书写block块中内容

    1. 注意事项


    2. {% extends 'base.html' %} 写在第一行,上面不写内容
    3. 要修改的 内容写在block块中,写在外面不显示

    4. {% extends 'base.html' %}  base.html 记得带上引号,不然当做变量去查找

    5. 定义多个block块,一般要定义上 css和js

6.组件

​ 把多个页面公用的HTML代码放在一个HTML文件中    —— 》组件  nav.html

​ 使用:  {% include  ‘nav.html’  %}

7.静态文件相关

{% load static %}

{% static  '静态文件相对路径' %}    ——》 获取到别名,跟后面的参数进行拼接

{% get_static_prefix %}  ——》 获取到别名

<link rel="stylesheet" href="{% get_static_prefix %}plugins/bootstrap-3.3.7/css/bootstrap.css">
8.自定义inclusion_tag
自定义inclusion_tag 返回HTML代码段
pagenation.html组件文件中写
<nav aria-label='Page navigation'>
<ul class='pagination'>
{% for foo in num%}
{% if current==foo %}
<li class='active'><a href='#'>{{ foo }}</a></li>
{% else %}
<li> <a href='#'>{{ foo }}</a></li>
{% endif %}
{% endfor%}
</ul>
</nav>
在templatetags包中的my_filters文件中写
@register.inclusion_tag('pagenation.html')
def pagenation(num,current):
return{'num':range(1,num+1),'current':current}
在应用的HTML文件中
{% load my_tags %}
{% pagenation 5 1 %}

  

原文地址:https://www.cnblogs.com/PythonMrChu/p/10065683.html