Django 5框架Web应用开发
文章平均质量分 77
夏天又到了
这个作者很懒,什么都没留下…
展开
-
Django5之命名空间
当出现上述这种情况时,如果在某个视图中使用reverse('index', args=(...)),或在模板中使用{% url 'index' ... %},那么最终生成的URL地址到底是路由A还是路由B呢?在Django框架中,要实现对URL链接地址的反向解析,除了应用级别的命名空间方式之外,还支持一种实例命名空间(namespace)方式。在第06行和第07行代码中,在ptah()函数中新定义了一个namespace属性,属性值就是实例命名空间。在第07行代码中,还是要添加app_name属性的定义。原创 2024-04-29 08:54:44 · 772 阅读 · 0 评论 -
Django URL路由配置之反向解析
因为,当URLconf模块被修改后,设计人员势必将手动修改HTML页面中的每一个超链接<a>标签中硬编码的href属性值,其工作量是可想而知的。例如下面这样一个很常见的场景,在页面中展示一个文章标题列表,且每个标题都被设计成一个超链接,单击该链接就进入对应文章的详细页面。在第07行代码中,在path()函数中新增了一个name参数(name='article-year-archive'),该参数主要在模板中使用。在第07~13行代码中,通过在HTML页面中使用for循环语句,实现了文章标题列表的显示。原创 2024-04-28 09:41:48 · 913 阅读 · 1 评论 -
URL路由基础与Django处理请求的过程分析
一般情况下,在Django项目根目录下需要配置一个urls.py(根路由)文件,然后在每个App下分别定义一个自己的urls.py,这样就相当于是一种比较先进的解耦模式。(1)决定要使用的根URLconf模块。(2)加载这个URLconf模块并寻找可用的urlpatterns路由模式,它是django.urls.path()实例或django.urls.re_path()实例的一个列表。在第02行代码中,通过调用django.urls模块导入了path(路径)对象,这是一个负责URL路由配置的模块。原创 2024-04-26 08:27:47 · 1309 阅读 · 1 评论 -
Django框架视图基础
在Django框架视图层的概念体系中,视图函数简称为视图,它是一个简单的Python函数,用于接收Web请求和返回Web响应。Django框架视图层对外负责接收用户请求,对内负责调度模型层与模板层,是连接用户前端页面和底层数据库的桥梁。Django框架的视图层还有一点特殊之处,就是它会根据业务逻辑将处理好的数据与前端进行整合后再返回给用户,从这方面来讲Django视图层更偏向于所谓的“后端”。Django视图层是负责处理请求的核心,是开发Web应用的重要组成部分。原创 2024-04-26 08:23:55 · 201 阅读 · 1 评论 -
Django5框架之多重继承
在第04~09行代码中,定义了第一个继承自基类Piece的类Article,它是一个用于描述文章的模型。在第11~16行代码中,定义了第二个继承自基类Piece的类Book,它是一个用于描述书籍的模型。在第09~10行代码中,定义了一个子类BookArticle,它是一个用于描述书籍和文章的模型,同时继承自Article模型和Book模型。在第18、19行代码中,定义了一个子类BookArticle,它是一个用于描述书籍和文章的模型,同时继承自Article模型和Book模型。原创 2024-04-25 08:39:04 · 390 阅读 · 1 评论 -
Django5框架之代理模型
一个代理模型既可以继承任意数量的抽象模型类(假设它没有定义任何模型字段),也可以继承任意数量的代理模型(只需共享同一个非抽象父类)。再次回看一下【代码3-24】,当使用Person模型对象进行查询时,Django框架是不会返回Child模型对象的,对于Person模型对象的查询结果集,总是返回相对应的类型(QuerySet仍会返回请求的模型)。比如在【代码3-25】中,也许不期望总是对Person进行排序,但在使用代理时总是会依据last_name属性进行排序,解决方法可参看下面的代码示例。原创 2024-04-25 08:37:19 · 938 阅读 · 0 评论 -
Meta和多表继承,继承与反向关系
在Django模型继承中,由于多表继承使用隐式的OneToOneField连接子类和父类,因此直接从父类访问子类是可能的。第01~04行代码中,定义了一个子类Restaurant,它继承自父类Place。其中,在第02行代码中定义了子类与父类的ManyToManyField关系。但是,如果在继承父类模型的子类中添加了这些关联,则必须指定related_name属性。第02行代码在定义子类与父类的ManyToManyField关系中,添加了“related_name='provider'”属性。原创 2024-04-24 08:52:09 · 889 阅读 · 0 评论 -
Django模型继承之多表继承
在Django模型继承中,支持的第二种模型继承方式是层次结构中的每个模型都是一个单独的模型。每个模型都指向分离的数据表,并且可以被独立查询和创建。在第07~10行代码中,定义了一个继承自抽象基类Place的、用于表示酒店的子类Hotel。在上述例子中,如果p不是一个Hotel对象,而仅仅是一个Place对象(又或是其他类的父类对象),那么指向p.hotel就会抛出一个Hotel.DoesNotExist类型的异常。在第03~05行代码中,定义了一个用于表示地点的抽象基类Place。原创 2024-04-24 08:49:28 · 1055 阅读 · 1 评论 -
related_name和related_query_name属性
在Django模型继承中,假如在外键或多对多字段中使用了related_name属性或related_query_name属性,则必须为该字段提供一个独一无二的反向名字和查询名字。但是,这样在抽象基类中一般会引发问题,因为基类中的字段都被子类继承并且保持了同样的值,这其中当然也包括related_name属性和related_query_name属性。不过,如果在设计时忘了使用“%(class)s”和“%(app_label)s”,那么Django会在执行系统检查或运行迁移时抛出错误。原创 2024-04-23 08:27:22 · 855 阅读 · 0 评论 -
Django模型继承之Meta继承
最后,基于Python语法继承的工作机制,如果子类继承了多个抽象基类,则默认情况下仅继承第一个列出基类的Meta选项。在Django模型继承中,当一个抽象基类被设计完成后,它会将该基类中定义的Meta内部类以属性的形式提供给子类。在第12~14行代码中,在Meta类中添加了属性“abstract=True”,表明Unmanaged类为抽象基类。另外,如果想让一个抽象基类的子类也同样成为一个抽象基类,则必须显式地在该子类的Meta类中同样声明一个“abstract=True”属性。原创 2024-04-23 08:25:12 · 1294 阅读 · 0 评论 -
Django模型的继承
Django模型的继承,包括模型的抽象基类、Meta继承、related_name和related_query_name属性、多表继承、Meta和多表继承、继承与反向关系、代理模型、代理模型继承和未托管模型,以及多重继承等内容。子类UserInfo因为继承自基类CommonInfo,所以顺带继承了基类CommonInfo中的name和age属性,这样子类UserInfo就拥有了3个字段属性,即name、age和home_group。在Django模型中,抽象基类在将公共信息放入很多模型时会非常有用。原创 2024-04-22 10:03:36 · 1166 阅读 · 0 评论 -
Django模型的属性与方法
Django模型中最重要的属性就是Manager,它是Django模型和数据库查询操作之间的接口,并且被用作从数据库当中获取实例的途径。Django模型中还有一个关于模型方法的集合,其中包含了一些可能是自定义的数据库行为,比如save()方法和delete()方法就是两个最有可能定制的方法。在第07~24行代码中,定义了PersonAge类的模型方法person_age_status(),返回具体年龄段的信息。本节介绍Django模型的属性和方法,以及如何重写之前定义的模型方法等内容。原创 2024-04-22 10:00:48 · 1101 阅读 · 0 评论 -
通过PyCharm平台开发Django应用程序
借助PyCharm开发平台,可以极大提高开发Django应用程序的效率,同时可以使用到很多非常实用的第三方插件。不过读者也要清楚,PyCharm开发平台所实现的功能,在底层也是借助Django命令行工具完成的。(1)打开PyCharm Pro专业版开发平台,通过文件菜单(File)的新建工程(New Project)选项创建Django项目,如图1.30所示。由上图可知,HelloDjango应用程序中的文件与之前通过命令行工具(django-admin.py)创建的结果是一致的。原创 2024-04-19 11:09:28 · 589 阅读 · 0 评论 -
通过命令行构建Django应用程序
通过命令行构建Django应用程序的关键,是使用一个Django框架自带的管理工具——django-admin.py,这是一个Python脚本文件。进入Django项目的根目录,运行上述简写命令,Django框架会以127.0.0.1:8000(ip:port)这个默认配置启动开发服务器。请读者再查看一下图1.20,它就在django目录下的bin目录中,具体如图1.25所示。在图1.26中可以看到,目录中已经有了通过django-admin命令新创建的Django项目(HelloDjango)。原创 2024-04-19 10:59:58 · 839 阅读 · 0 评论 -
Django模型的字段选项
在第14~18行代码中定义了一个字符型域变量year_in_college,将choices值定义为变量YEAR_IN_COLLEGE_CHOICES,默认值为FRESHMAN。在第08~13行代码中定义了一个choices类型的变量YEAR_IN_COLLEGE_CHOICES,其中包含了4个元组,使用了第04~07行代码中定义的变量。null的默认值为False,如果设置为True,则当该字段为空时,Django模型会将数据库中的该字段设置为NULL。如果未指定,则使用该域的名称。原创 2024-04-18 16:32:14 · 919 阅读 · 4 评论 -
Django模型的字段类型
字段类型用以指定数据库的数据类型,例如Integer、VARCHAR和TEXT这几种比较常用的数据类型。在Django模型定义中,字段类型均派生自Field类的实例。Django框架中的Field类是一个抽象类,专门用于定义数据库表的列表项。Django模型中最重要并且也是唯一必须执行的就是字段定义。字段在类中进行定义,对应于实体数据库的字段。另外,定义模型字段名时为了避免冲突,不建议使用模型API中已经定义的关键字。Django模型一共内置了多种字段类型,基本能够满足一般的设计需求。原创 2024-04-18 16:29:00 · 948 阅读 · 0 评论 -
Django模型入门
第03~06行代码定义了一个PersonInfo类,并通过models对象调用CharField()方法定义了name(姓名)、gender(性别)和age(年龄)3个字段,且每个字段的长度不一。这个类属性其实就相当于实体数据库中的数据项(也称数据列)。如果需要设计实现一个简单的个人信息模型(名称为PersonInfo),我们一般会定义这个个人信息模型的模型名称、字段名称、字段类型等参数,如表3.1所示。在第01行代码中,通过调用django.db模块导入了models对象(Django模型对象)。原创 2024-04-13 09:59:15 · 567 阅读 · 0 评论 -
Django模型基础
Django模型在业务逻辑层和实体数据库之间充当着桥梁的作用,通过使用描述对象和实体数据库之间的映射的元数据,将程序中的对象自动持久化到实体数据库中。MySQL是Web应用开发中比较常用的关系数据库,这里我们就以MySQL数据库为例,详细介绍在Django模型中使用数据库的方法。此时,ORM就相当于一个中间层的逻辑数据,连接着上层的编程语言与底层的实体数据库。本节先介绍一下Django框架模型的基础知识,主要包括Django模型介绍、Django模型与ORM,以及Django模型与MySQL等方面的内容。原创 2024-04-13 09:55:56 · 756 阅读 · 0 评论 -
Django框架设计原理
不过从严格意义上讲,Django框架采用了一种更为特殊的MTV设计模式,其中的“M”代表模型(Model),“T”代表模板(Template),“V”代表视图(View)。这样做的好处就是将设计人员从烦琐的控制层逻辑中解脱出来,通过编写更少的代码来实现用户需求,而控制层逻辑交由Django框架底层自动去完成,从而大大地提高了设计人员的开发效率。模板接收用户输入后交由视图去处理,视图负责连接模型进行数据操作,并将操作结果传递给模板进行展示,以上就是Django框架所设计的MTV模式的基本工作原理。原创 2024-04-12 08:45:12 · 591 阅读 · 0 评论 -
Django框架的基础知识
Django框架的诞生,最初是用来开发和管理Lawrence Publishing Group(劳伦斯出版集团)旗下的新闻网站,它是一款属于CMS(内容管理系统)类的软件,并于2005年7月取得了BSD许可证下的发布权限。Django框架的设计初衷是简便、快速地开发出易于维护的数据库驱动型网站,其所独具的代码复用功能,支持将各种组件以“插件”方式嵌入整个应用框架,从而极大地提高了应用开发的效率。Django框架的缓存系统采用与memcached、Redis等结合使用的方式,提高了页面的加载速度。原创 2024-04-12 08:43:04 · 342 阅读 · 0 评论