python学习点滴记录-Day18-django-orm

第18天课程内容:

  • 模板语言的常用标签
  • 自定义过滤器与标签
  • 模板语言之继承
  • ORM的查询API
  • 单表查询之双下划线
  • 一对多的添加数据方法

mtv补充

修改pycharm连接db为mysql时遇到的问题

解决:

在项目的__init__.py文件中加

import pymysql

pymysql.install_as_MySQLdb()

post提交表单数据时,默认会提示403 forbidden,需要在form表单处添加{% csrf_token %},render方法会为它渲染一个随机字符串一并提交给服务端做验证,就可以解决了;也可以临时在settings里注释掉关于csrf的配置。(不推荐)


自定义标签和过滤器

django提供的标签与过滤器毕竟有限,更多的是需要自己去自定义标签和过滤器,以下是过程:

1、在settings中的INSTALLED_APPS配置当前app,不然django无法找到自定义的simple_tag.

2、在app中创建templatetags模块(模块名只能是templatetags)

3、创建任意 .py 文件,如:my_tags.py

from django import templatefrom django.utils.safestring import mark_safe

register = template.Library()# 以上为固定格式@register.filter #自定义过滤器def multi(x,y):    return x*y

@register.simple_tag#自定义标签def mult_tag(x,y,z):    return x**y**z

4、在使用自定义simple_tag和filter的html文件中导入之前创建的 my_tags.py

{% load my_tags %} 

5、使用simple_tag和filter(如何调用)

<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <title>Title</title>

</head><body>{#自定义过滤器:在通过render方法渲染页面时只支持接受2个参数#}{% load Mytag %}<h2>{{ n1|multi:2 }}</h2><hr>{#自定义标签:可以接受多个参数,通过render方法渲染页面时也没问题#}<h1>{% mult_tag 2 6 2%}</h1>

</body></html>

注意:filter可以用在if等语句后,simple_tag不可以

{% if num|filter_multi:30 100 %}

    {{ num|filter_multi:30 }}

{% endif %}

总结:

tempalte(模板层):

        功能: 为了更有逻辑的将数据库中的数据渲染到模板中

        模板语法
              变量  {{ }}

                   深度查询: 句点符 .
                   过滤器: {{var|filter_name:参数}}   

            标签  {% url %}  

                  {% for i in obj %}    {% endfor %}

                  {% if %}        {%endif%}

                  {% with %}
                  {% csrf_token%}    

            自定义过滤器与标签:
                定义流程:
                   1、在settings中的INSTALLED_APPS配置当前app,不然django无法找到自定义的simple_tag.
                   2、在app中创建templatetags模块(模块名只能是templatetags)
                   3、创建任意 .py 文件,如:my_tags.py:
                             from django import template
                            from django.utils.safestring import mark_safe

                            register = template.Library()  # register的名字是固定的,不可改变

                            @register.filter      # 定义过滤器
                            def multi(x,y):

                                return x*y

                            @register.simple_tag   # 定义标签
                            def multi_tag(x,y,z):
                                return x*y*z

                   4、在使用自定义simple_tag和filter的html文件中导入之前创建的 my_tags.py

                            {% load my_tags %} 

                   5、使用simple_tag和filter(如何调用)

                   总结区别:
                         1、自定义filter只能接受两个参数
                         2、自定义simple_tag不能与if使用

            继承:
                     创建base.html
                     {%block content%}{%endblock%}

模板继承 (extend)

Django模版引擎中最强大也是最复杂的部分就是模版继承了。模版继承可以让您创建一个基本的“骨架”模版,它包含您站点中的全部元素,并且可以定义能够被子模版覆盖的 blocks 。

通过从下面这个例子开始,可以容易的理解模版继承:

这个模版,我们把它叫作 base.html, 它定义了一个可以用于两列排版页面的简单HTML骨架。“子模版”的工作是用它们的内容填充空的blocks。

在这个例子中, block 标签定义了三个可以被子模版内容填充的block。 block 告诉模版引擎: 子模版可能会覆盖掉模版中的这些位置。

子模版可能看起来是这样的:

extends 标签是这里的关键。它告诉模版引擎,这个模版“继承”了另一个模版。当模版系统处理这个模版时,首先,它将定位父模版——在此例中,就是“base.html”。

那时,模版引擎将注意到 base.html 中的三个 block 标签,并用子模版中的内容来替换这些block。根据 blog_entries 的值,输出可能看起来是这样的:

请注意,子模版并没有定义 sidebar block,所以系统使用了父模版中的值。父模版的 {% block %} 标签中的内容总是被用作备选内容(fallback)。

这种方式使代码得到最大程度的复用,并且使得添加内容到共享的内容区域更加简单,例如,部分范围内的导航。

这里是使用继承的一些提示:

  • 如果你在模版中使用 {% extends %} 标签,它必须是模版中的第一个标签。其他的任何情况下,模版继承都将无法工作。
  • 在base模版中设置越多的 {% block %} 标签越好。请记住,子模版不必定义全部父模版中的blocks,所以,你可以在大多数blocks中填充合理的默认内容,然后,只定义你需要的那一个。多一点钩子总比少一点好。
  • 如果你发现你自己在大量的模版中复制内容,那可能意味着你应该把内容移动到父模版中的一个 {% block %} 中。
  • If you need to get the content of the block from the parent template, the {{ block.super }} variable will do the trick. This is useful if you want to add to the contents of a parent block instead of completely overriding it. Data inserted using {{ block.super }} will not be automatically escaped (see the next section), since it was already escaped, if necessary, in the parent template.
  • 为了更好的可读性,你也可以给你的 {% endblock %} 标签一个 名字 。例如:
{% block content %}
...
{% endblock content %}  
  • 在大型模版中,这个方法帮你清楚的看到哪一个  {% block %} 标签被关闭了。

最后,请注意您并不能在一个模版中定义多个相同名字的 block 标签。这个限制的存在是因为block标签的作用是“双向”的。这个意思是,block标签不仅提供了一个坑去填,它还在 _父模版_中定义了填坑的内容。如果在一个模版中有两个名字一样的 block 标签,模版的父模版将不知道使用哪个block的内容。

ORM的相关

ORM

映射关系:

     表名  <-------> 类名

       字段  <-------> 属性

    表记录 <------->类实例对象

创建表(建立模型)

实例:我们来假定下面这些概念,字段和关系

作者模型:一个作者有姓名和年龄。

作者详细模型:把作者的详情放到详情表,包含生日,手机号,家庭住址等信息。作者详情模型和作者模型之间是一对一的关系(one-to-one)

出版商模型:出版商有名称,所在城市以及email。

书籍模型: 书籍有书名和出版日期,一本书可能会有多个作者,一个作者也可以写多本书,所以作者和书籍的关系就是多对多的关联关系(many-to-many);一本书只应该由一个出版商出版,所以出版商和书籍是一对多关联关系(one-to-many)。

模型建立如下:

时间: 2024-10-27 19:01:39

python学习点滴记录-Day18-django-orm的相关文章

python学习点滴记录-Day20(分页、cookie/session、ajax)

上节课内容回顾:ORM增删改查 Django提供的分页器使用以及分析讲解 Cookie和session讲解与在Django中的使用 ajax的讲解与简单使用 Django分页器(paginator) 要使用Django实现分页器,必须从Django中导入Paginator模块 from django.core.paginator import Paginator 假如现在有150条记录要显示,每页显示10条 >>> from django.core.paginator import Pa

python学习点滴记录-Day17-django-part2

url配置系统之无名分组 url配置系统之有名分组 url配置系统之分发app url配置系统之url反向解析 视图函数之请求对象 视图函数之响应对象 模板语法之渲染变量 模板语法之变量过滤器 ORM URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表:你就是以这种方式告诉Django,对于这个URL调用这段代码,对于那个URL调用那段代码. ''' urlpatterns = [ url(正则表达式, views视图函数,参

python学习点滴记录-Day01

参考链接 https://triaquae.gitbooks.io/python/content/chapter1.html 一.python的安装 1.windows平台的到python官网下载windows版本安装介质,按照提示安装完毕即可使用. 2.linux平台的可以通过yum或者python官网下载tar包进行安装. 无论是windows还是linux下,为了方便使用,建议添加到环境变量中. windows:计算机属性--高级系统设置--系统--环境变量--PATH中添加python的

python学习点滴记录-Day03

函数基础 一. 使用函数带来的好处 #使代码组织结构清晰#减少代码冗余#可以统一管理且降低维护难度可以把函数当作日常生活中的工具,具备某种功能的物件,直接拿来使用即可. 二.函数的分类 内置函数:python解释器内置了大量函数方便开发者直接使用 自定义函数:根据自身需求自己编写的函数 三.函数的使用 定义函数 函数的定义与变量的定义类似,需要提前定义再调用 定义函数时只检测语法,不执行代码 def 函数名(arg1,arg2,arg3): '''注释''' 函数体 return 返回值 调用函

python学习点滴记录-Day08

本次课大纲 接口与归一化设计 多态与多态性 封装 静态属性property 面向对象高级 异常处理 网络编程 接口与归一化设计 1.什么是接口 =================第一部分:Java 语言中的接口很好的展现了接口的含义: IAnimal.java /* * Java的Interface接口的特征: * 1)是一组功能的集合,而不是一个功能 * 2)接口的功能用于交互,所有的功能都是public,即别的对象可操作 * 3)接口只定义函数,但不涉及函数实现 * 4)这些功能是相关的,都

python学习点滴记录-Day22

文件上传 form表单文件操作 ajax文件操作 头像上传 默认头像覆盖 预览 注册页面,form钩子,清空之前的error信息 博客首页,初始化数据,首页样式调试. auth实现登录与注册 个人中心左侧的昵称 园龄 头像:分类归档.标签归档.时间归档: 各个url跳转 文章详情页 点赞 不能重复点赞, 事物 def diggit(request): from django.db.models import F from django.db import transaction state={"

python学习点滴记录-Day02补充-文件操作

字符编码: 把人类的字符翻译成计算机能认识的数字 字符编码表 存放着人类字符和计算机数字的对应关系表 ascii.gbk.utf-8.unicode unicode>encode(utf8)>bytes bytes>decode(utf8)>unicode 文件处理补充: 字符以什么格式编码的,就要以什么格式解码 文件的打开模式 文件句柄 = open('文件路径', '模式') 打开文件时,需要指定文件路径和以何等方式打开文件,打开后,即可获取该文件句柄,日后通过此文件句柄对该文

python学习点滴记录-Day12-前端基础之html

html 定义: 超文本标记语言(Hypertext Markup Language,HTML)通过标签语言来标记要显示的网页中的各个部分.一套规则,浏览器认识的规则 浏览器按顺序渲染网页文件,然后根据标记符解释和显示内容.但需要注意的是,对于不同的浏览器,对同一标签可能会有不完全相同的解释(兼容性) 静态网页文件扩展名:.html 或 .htm HTML 不是一种编程语言,而是一种标记语言 (markup language) HTML 使用标记标签来描述网页 html结构 <!DOCTYPE

python学习点滴记录-Day21-项目

待整理 ajax的跨域三种方式 单独的cookie验证,写入与调取验证 form组件 用来校验用户提交的数据 可以做到保留正确信息 ,提示错误信息 以上为上午内容 下午内容 梳理博客项目所需要的表,表与表之间的关系 验证码