视图层

三板斧

  HttpResponse:返回字符串类型
  render:返回html,并且可以给页面传值
  redirect:重定向
  视图函数必须要返回一个httpresponse对象

JsonResponse对象

  数据交互需要使用json过度,实现跨语言数据传输
  from django.http import JsonResponse
  JsonResponse(user_dict)

文件上传

  form上传文件类型的数据:method必须指定成post;enctype必须制定为multipart/form-data
  file_obj = request.FILES.get('file')
  file_obj.name
  with open(file_obj.name,'wb') as f:
        for line in file_obj.chunks():
              f.write(line)

request对象方法

  request.methdo
  request.POST
  request.GET
  request.FILES
  request.path 只能拿到路由
  request.get_full_path 也能拿到?后面的信息
  request.path_info 只能拿到路由
  request.body 原生的浏览器发过来的二进制数据

CBV

  views:
  from django.views import View
  class MyLogin(View):
        def post(request):
              pass
        def get(request):
              pass
  urls:
  url(r'^login/',views.MyLogin().as_view())

模板语法

  1.可以传递python所有数据类型
        {{}}:变量相关
        {%%}:逻辑相关
  2.函数名放在模板语法内,会加括号自动调用,但是模板语法不支持给函数传额外的参数,而且不会报错,不会执行
  3.类名放在模板语法呢,也会加括号自动调用,也就是实例化,对象是可以被传递的,对象被展示到html页面上,会触发__str__方法
  4.django模板语法的取值是固定的格式,只能采用句点符号,就是.

过滤器

  类似于模板语法内置的一些方法,Django内置有60多个过滤器
  {{ 变量名|过滤器:参数 }}
  {{ s|length }} 长度
  {{ b|default: }} 类似于字典的get,前面布尔值如果为true,返回第一个,不然返回第二个
  {{ f|filesezeformat: }} 计算文件的大小
  {{ d|date:'Y-m-d' }} 格式化时间
  {{ l|slice:'0:4:2' }} 切片,支持步长
  {{ info|truncatechars:9 }} 摘要处理,截取字符,三个点也算
  {{ e|truncatewords:9 }} 截取单词,不包含三个点,只会按空格截取
  {{ msg|cut:'' }} 移除特定的字符
  {{ l|join:'#' }} 拼接操作
  {{ n|add:10 }}  拼接操作,包含加法,字符串
  {{ h|safe }} 转义
        from django.utils.safestring import mark_safe
        res = mark_safe()

for循环

  forloop.counter0  索引
  forloop.first  第一次为true
  forloop.last   最后一次为true

with语法

  {% with info as i %}
        在with语法内,可以通过别名快速地使用到前面的句式
  {% endwith %}

自定义过滤器、标签、inclusion_tag

  先三步走:
        1.在应用下创建一个名字必须叫templatetags文件夹
        2.在该文件夹内创建任意名称的py文件
        3.在该py文件内必须先书写下面两句话(单词一个都不能错):
              from django import template
              resigter = template.Library
  # 过滤器,最多有两个参数
  @register.filter(name='baby')
  def my_func(v1,v2):
        return v1 + v2
  {% load my_tag %} # 加载py文件
  {{ n|baby:2 }}
  # 标签,参数可以有多个
  @register.sample_tag(name='plus')
  def my_sample(a,b,c,d):
        return a+b+c+d
  {% load my_tag %} # 加载py文件
  {% plus 'jason' a b c d %} # 参数之间用空格隔开
  # inclusion_tag
  @register.inclusion_tag('left_menu.html')
  def my_inctag(n):
  data = ['第{}项'.format(i) for i in range(10)]
  return locals() # 将data传给left_menu.html
  {% left 10 %} # 当html页面某一个地方页面需要传参数才能够动态的渲染出来,并且在多个页面上都需要使用到该局部,那么就考虑将该局部部页面做成inclusion_tag形式

模板的继承

  {% extends 'home.html' %} # 继承了整个html页面
  # 模板页面需要变动的地方如何处理?
  {% block content %} # 对需要变化的页面做一个标记,叫content
  {% endblock %}
  # 然后,在子页面中
  block + tab
  {% block content %}
        自己独有的内容
  {% endblock %}

模板的导入

  # 将页面的某一个局部当成模块的形式,哪个地方需要导入即可
  {% include 'xx.html' %}
原文地址:https://www.cnblogs.com/qijiaxun/p/14257374.html