wordpress字段组调用(wordpress调用指定文章)

WordPress作为全球最受欢迎的博客平台和内容管理系统,其灵活性和可扩展性一直备受好评。而字段组(Field Groups)作为WordPress插件之一,为我们提供了强大的自定义字段功能。本文将深入解析WordPress字段组调用,并分享一些实战技巧,帮助您更好地利用这一工具。

一、什么是WordPress字段组?

WordPress字段组是一种将多个字段组合在一起的插件,它允许您在自定义表单、页面、文章等地方添加各种类型的字段,如文本框、下拉菜单、复选框等。通过字段组,您可以轻松实现内容管理、表单收集、数据展示等功能。

二、WordPress字段组调用方法

1. 安装与激活字段组插件

您需要在WordPress后台安装并激活“Advanced Custom Fields”(简称ACF)插件。安装完成后,插件会自动在“工具”菜单中添加“字段组”子菜单。

2. 创建字段组

在“字段组”子菜单中,点击“添加新字段组”按钮,进入字段组编辑页面。在这里,您可以设置字段组的名称、描述、位置等信息。

3. 添加字段

在字段组编辑页面,点击“添加字段”按钮,选择您需要的字段类型。目前ACF插件支持多种字段类型,如文本框、文本区域、数字、日期、时间、下拉菜单、复选框等。根据实际需求,设置字段的名称、标签、选项等属性。

4. 调用字段组

在需要调用字段组的页面或文章中,使用以下短代码进行调用:

“`html

“`

其中,“字段组名称”为步骤2中设置的名称,“post_id”为需要调用字段的页面或文章ID。

三、实战技巧

1. 字段分组与排序

在实际应用中,为了提高用户体验,您可以将字段进行分组和排序。在字段组编辑页面,点击“添加分组”按钮,为字段创建分组。然后,将字段拖动到对应分组中,并调整排序。

2. 条件字段

ACF插件支持条件字段,即当某个字段值满足特定条件时,才显示其他字段。在字段设置中,选择“条件”选项,设置条件字段和条件值。

3. 重复字段

重复字段允许您在同一个字段组中添加多个相同类型的字段。在字段设置中,选择“重复”选项,设置重复字段的属性。

4. 预设值与默认值

为字段设置预设值和默认值,可以提高数据录入效率。在字段设置中,选择“预设值”或“默认值”选项,设置相应值。

5. 自定义模板

ACF插件支持自定义模板,您可以根据实际需求,编写自定义模板来展示字段内容。在字段设置中,选择“模板”选项,编辑模板代码。

WordPress字段组调用为我们提供了强大的自定义字段功能,可以帮助我们轻松实现内容管理、表单收集、数据展示等功能。通过本文的介绍,相信您已经对WordPress字段组调用有了更深入的了解。在实际应用中,结合以上实战技巧,您将能够更好地发挥字段组的作用,为您的网站打造更丰富的用户体验。

以下是一个简单的表格,展示了ACF插件支持的字段类型:

字段类型 描述
文本框 用于输入单行文本。
文本区域 用于输入多行文本。
数字 用于输入数字。
日期 用于选择日期。
时间 用于选择时间。
下拉菜单 用于选择预设的选项。
复选框 用于选择多个选项。
单选按钮 用于选择单个选项。
图片选择器 用于选择图片。
文件上传 用于上传文件。
页面选择器 用于选择页面。
分类选择器 用于选择分类。
关联对象 用于选择关联的对象,如文章、用户等。
关联分类 用于选择关联的分类。
关联用户 用于选择关联的用户。
关联评论 用于选择关联的评论。
重复字段 用于添加多个相同类型的字段。
条件字段 当某个字段值满足特定条件时,才显示其他字段。
自定义模板 根据实际需求,编写自定义模板来展示字段内容。

希望本文能帮助您更好地了解WordPress字段组调用,为您的网站开发带来更多可能性。

如何自定义wordpress文章的固定链接

WordPress是一款开源网站建设程序,因其强大的功能和可扩展性而大受欢迎。关于WordPress扩展,主要是其插件众多,可以使用不同功能插件来扩展网站需求。WordPress所有固有的内容类型非常有限,毕竟其开始是以博客系统为基础的。对于像企业站需要的产品类型,电影站需要的国家属性等,显示不便。现在推荐一款自定义内容类型/字段分类法插件–Pods可以扩展你所需要的内容类型。

pods是一款用在 WordPress上的自定义内容类型的插件,但是 pods拥有的功能却完全不限于此。pods能够扩展现有的内容类型,比如为用户资料(user)增加一个“电话”字段。此外,它还有权限管理功能,类似于“members”插件。此外,还有高级自定义内容类型,改变“标题”这个字段名称。再此外,它还有内容关系的功能。

这篇文章我们除了介绍 pods的使用方法以外,还会介绍内容类型的列表页,内容页的制作,pods字段的前台模板调用,增加内容类型到菜单等等。

扩展已有

WordPress默认有三大内容类型:文章(posts)、页面(page)、媒体(attachment),可能“用户(user)”也算一个内容类型,因为“用户”也可以扩展。默认的分类法有:分类目录(category)、标签(tag)。默认的内容类型和分类法在项目中字段经常不够用。

扩展文章字段

1、安装好 pods后,点击“pods管理-添加”,点击“扩展已有”、选择“内容类型(文章、页面,等等)”,下方选择“文章”,点击“下一步”。

2、点击“添加字段”,比如添加一个“文章来源”的文本类型的字段,这里有几个选框。

代表的含义为:

标签:显示在发布时候的名称,可以为中文。

名称:内部使用,存在数据库里的名称,可用于模板调用,只能为字母、数字、下划线,不能以数字开头。

描述:发布时对字段的简要说明,选填。

字段类型:字段的类型,如,文本框、文本区域、文件等等。

选项:该字段是否为必填。

3、点击“添加字段”,完成添加,点击“Save Pod”保存添加。

这个时候去发布文章看看,在下方就多了个文章来源字段了。快点去用同样的方法可以为页面、媒体、用户、评论添加自定义字段吧。

创建新的

创建新的内容类型

进入到 pods的添加界面,选择“创建新的”,接下来选择“自定义内容类型”。

标签填写内容类型名称,可以为中文,比如填写个“电影”,点击下面的“高级”,在 pod name填写内容类型的机读名称,点击“下一步”,完成一个自定义内容类型的创建,你可以在左边栏找到“电影”这个内容类型。

为自定义内容类型添加字段。新创建的自定义内容类型,默认拥有“文章”这个内容类型的所有字段,比如标题、内容、日期等等,我们是在这些基础上添加新的需要的字段,比如现在添加一些字段:海报、地区、时长、年份等等。再去发布“电影”,你会发现下方多了刚刚添加的这些字段。

创建好自定义内容类型后,你会发现还有很多标签页:“管理字段”、标签、管理界面、高级选项。

标签:在后台显示的标签,根据需要修改。

管理界面:管理内容类型在后台的显示,尝试把菜单位置改为更大的值试试看。

高级选项:对自定义内容类型的设置,请把“拥有归档”勾上。

创建自定义分类法

打开 pods的添加界面,选择“创建新的”,接下来选择“自定义分类法”。

标签填写分类法名称,可以中文,比如填写“电影类型”,点击下面的“高级”,在 pod name填写分类法的机读名称,点击“下一步”,完成一个自定义分类法的创建。

创建完成以后,有几个标签页,主要关注以下几个:

高级选项中,“层级”,表示该分类法是否有层级关系,打上勾相当于“分类目录”分类法,不打钩相当于“标签”分类法,我建议打上勾。“相关内容类型”,为这个分类法应用到哪一个内容类型,比如我这里,勾上了“电影”。我在发布电影的时候,在右边栏就可以有电影类型选择了。

其他字段:这是为自定义分类法添加字段,这个按照需要开启,比如你想为电影类型中的科幻片分类添加一个略缩图字段等等。

创建自定义设置页面—制作主题选项

有没有觉得做主题的时候,为主题添加选项比较麻烦,pods有个超简单的方法,使用自定义设置页面轻松搞定。

打开 pods的添加界面,选择“创建新的”,接下来选择“自定义设置页面”,标签填写页面名称,可以使用中文,比如填写“主题选项”,菜单位置由自己选:在设置菜单、外观菜单下,新菜单,我这里选择添加到外观菜单。点击下面的“高级”,在 pod name填写自定义设置页面的机读名称,点击“下一步”,这样就完成了一个自定义页面的创建。

创建完成以后,可以去添加一些字段,比如我添加了:网站 logo、网站标题、网站关键字、网站描述、统计代码、网站备案号字段,要注意字段类型。

接下来保存后看看你的左边栏对应的菜单位置吧。

好了,pods的基础功能就这么一些,这些功能网上很多插件都能实现,其实更重要的内容,还在于他的组件,pods的组件给 pods扩充了非常多的功能,这才是 pods真正的强大之处。

pods组件

高级自定义内容类型

进入“pods管理-组件”,启用“Advance Content Type”。

这个时候,到 pods的添加页面,多了一项“高级内容类型”,选择它,这里我重新建立一个电影内容类型。点击“下一步”完成创建。

创建完成之后,会发现默认有了一些字段,这就是 WordPress默认的字段,你可以修改或者删除它。

编辑好字段以后,再去看看其他标签页。下面主要介绍重要的设置:

“管理界面”的“管理界面样式”,可以自己写个 WordPress管理后台页面。

“高级选项”的“标题字段”,如果修改了标题字段,或者想要改变标题字段,请在这里选择。

高级内容关系

进入“pods管理-组件”,启用“Advance Relationships”,这个时候在添加内容关系字段以后,你可以看到多了几行,这些高级的内容关系,可以创建更加复杂的内容关系。

权限与角色管理

进入“pods管理-组件”,启用“Roles and Capabilities”,如果你用过 members插件,你会发现这功能和 members功能很相似,一样的强大。可以对所有的权限分角色的管理,可以添加、编辑、删除用户角色。

更多组件

pods管理后台还有其他实用的组件,更多的组件功能,不一一介绍,看组件名字大概能清楚他的功能。pods官方有提供其他组件,一些是单独的插件,一些是配合 pods工作的组件。

前端调用

模板命名

我发现,虽然很多人都会用自定义内容类型,但是内容类型的列表页不好做,即使做好,又该怎么放到菜单上显示出来,比如将“电影”列表页放在菜单中,自定义内容类型绑定了一个自定义分类法,又该怎么去显示分类法中某个分类下的文章,比如“科幻片”这个电影分类。

模板命名规则:

自定义内容类型模板命名规则:archive-{post_type_name}.php如 archive-movies.php

自定义分类法模板命名规则:taxonomy-{taxonomy_name}.php如 taxonomy-movie_type.php

自定义内容类型内容页模板命名规则:single-{post_type_name}.php如 single-movies.php

将内容类型加入到菜单,需要安装一个插件“Custom Post Type's Archive in WP Nav Menu”,安装好之后,没有任何设置界面,进入到“外观-菜单”,你可以发现菜单编辑区域的左边有了一个custom post type archives,现在内容类型就在这里了,如果你发现内容类型不在这,那就请到 pods的内容类型管理界面的高级选项中确认你的“拥有存档”这个选项已经打上勾了。

注:可能由于缓存问题,如果发现添加了内容类型到菜单后,前台点击内容类型的菜单出现404页面,请到“设置-固定链接”,点击一下保存即可。

数据调用

后台配置好,其实最主要的,还是要能够显示出来才是最重要的,pods的显示方法有三种:

短代码方式显示,短代码请参考 pods短代码文档,配合 pods官方提供的 magic tags。

利用 pods的“page”和“template”组件,这两个组件可在 pods组件中开启,请参考文章。

利用模板函数,即将重点介绍。

这里只介绍模板函数方式调用 pods数据,因为这才是做主题开发时能使用的东西。

输出函数

Pods显示数据函数

pods_field_display($pod,$post->ID,'$field)

关于该函数的文档,请查看 pods官方文档。

function pods_field_display($pod,$id= false,$name= null,$single= false)

参数数据类型备注

$pod(string) Pod name,即为 pods机读名称

$id(mixed)(选填)某篇文章ID或slug,以查询该篇文章数据

$name(string|array)字段名称,或者关联数组的参数

$single(boolean)(选填)是否以数组的形式返回

图像字段输出函数

pods_field_display()不会真正的显示出一张图片,而是显示出图片的 URL,pods特地为图片显示定义了一个函数:

pods_image($image,$size='thumbnail',$default= 0,$attributes='',$force= false)

关于该函数文档,请查看官方文档。

function pods_image($image,$size='thumbnail',$default= 0,$attributes='',$force= false)

参数数据类型备注

$image(array|int|string)图片字段的数组,或ID,或guid

$size(string|array)图片大小样式

$default(int)如果图片不存在,则显示该图片$default

$attributes(string|array)图片属性(内部通过 wp_get_attachment_image获取)

$force(boolean)强制规定大小

图片有单张图片和多张图片,如不清楚单张与多张,请到 pods添加字段查看。如果字段是多张图片,那么会返回一个数组,所以,输出图像字段的代码为:

单张图片字段示例代码:

<?php

echo pods_image( get_post_meta($post->ID,$image_field_name, true),’original’);

?>

多张图片字段:

<?php

$images=get_post_meta($post->ID,’images’);

foreach($images as$image)

{

echo pods_image($image,’original’);

}

?>

输出字段注意事项:

yes/no字段:后台勾选“是”输出 1,不勾选输出空值。

Code字段:可执行 php脚本代码,输出 php代码执行结果。

Website字段:本人无法输出该字段内容,请勿使用。

因为 pods自定义字段也属于 WordPress内部自定义字段,所以依然可以使用 WordPress的 get_post_meta()输出,但是也并不是所有字段都能输出,经过测试,可直接使用 get_post_meta()函数输出的字段有:

Phone

Email

Password

Pptext

Date time

Pnumber

Currency

Color

对于其他字段,请使用 pods_field_display();

模板代码段示例

在主循环中

代码示例:

<?php if(have_posts()):while(have_posts()): the_post();?>

<h1>

<a href=””>

<?php the_title();?>

</a>

</h1>

<!–标题–>

<div>

<div>

<span>年份:</span>

<?php echo pods_field_display('movie',$post->ID,'time');//显示(年份)time字段?>

</div>

<div>

<span>区域:</span>

<?php echo pods_field_display('movie',$post->ID,'zone');//显示(区域)zone字段?>

</div>

<div>

<span>时长:</span>

<?php echo pods_field_display('movie',$post->ID,'how_long');//显示(时长)how_long字段?>

<span>分钟</span>

</div>

<div>

<span>海报:</span>

<?php echo pods_image( get_post_meta($post->ID,'poster', true),'original');//显示海报字段?>

</div>

</div>

<!–显示自定义字段–>

<div>

<?php the_excerpt();?>

</div>

<!–内容摘要–>

<?php endwhile;endif;?>

万能循环示例代码

<?php query_posts('showposts=5&post_type=movie');while(have_posts()): the_post();?>

<h1>

<a href=””>

<?php the_title();?>

</a>

</h1>

<!–标题–>

<div>

<div>

<span>年份:</span>

<?php echo pods_field_display('movie',$post->ID,'time');//显示(年份)time字段?>

</div>

<div>

<span>区域:</span>

<?php echo pods_field_display('movie',$post->ID,'zone');//显示(区域)zone字段?>

</div>

<div>

<span>时长:</span>

<?php echo pods_field_display('movie',$post->ID,'how_long');//显示(时长)how_long字段?>

<span>分钟</span>

</div>

<div>

<span>海报:</span>

<?php echo pods_image( get_post_meta($post->ID,'poster', true),'original');//显示海报字段?>

</div>

</div>

<!–显示自定义字段–>

<div>

<?php the_excerpt();?>

</div>

<!–内容摘要–>

<?php endwhile;wp_reset_query();?>

自定义设置页面(调用主题选项数据)

请注意$id参数为 pods-settings-{slug_name},比如我的 pods name为 theme_option,那么$id的实参应该为'pods-settings-theme_option'。

<?php echo pods_field_display('theme_option','pods-settings-theme_option','site_logo');?>

<?php echo pods_field_display('theme_option','pods-settings-theme_option','site_title');?>

<?php echo pods_field_display('theme_option','pods-settings-theme_option','site_keyword');?>

<?php echo pods_field_display('theme_option','pods-settings-theme_option','site_description');?>

<?php echo pods_field_display('theme_option','pods-settings-theme_option','site_tongji');?>

<?php echo pods_field_display('theme_option','pods-settings-theme_option','site_beian');?>

django名字怎么样

导读:很多朋友问到关于django名字怎么样的相关问题,本文首席CTO笔记就来为大家做个详细解答,供大家参考,希望对大家有所帮助!一起来看看吧!

本文目录一览:

1、该如何命名你的Django Apps2、国内有哪些 Django牛人?3、“django”是什么意思?4、django是做什么的?5、Django什么情况该如何命名你的Django Apps很多人在创建Django Apps时会有自己的命名习惯,例如有人喜欢命名详细具体的名字,生怕不够具体。

实际上,一个好的命名系统取的名字往往乏味,枯燥,显而易见。在为Django Apps命名上可遵循以下原则:

1.尽量保持一个单词作为你的APP名称,例如:flavors,animals,blog,polls,dreams,finances.一个好的、通俗易懂的App名字将使得项目更容易维护。

2.一般来说,应用程序的名称应该是应用程序主model的复数版本,但是这个规则有很多例外,”blog”是最常见的一种。

3.不过,不能只考虑APP的主model,你应该也考虑你想如何构造你的UTLs,如果你想你网站的blog通过访问,name你可以考虑将你的博客APP命名为”weblog”,而非”blog”、”posts”、”blogposts”,即使你的主model是”Post”,这样做可以让你更容易地看到哪个应用程序对应于站点的哪一部分。

4.使用有效的、符合PEP 8的、可导入的Python软件包名称:带小写字母的短名称,不带数字、破折号、句点、空格或特殊字符。如果需要可读性,可以使用下划线分隔单词,但不鼓励使用下划线。

总的来说命名Django Apps应该:遵循PEP8有效的命名(尽量不用下划线),根据你想构造的URL访问地址命名你的APP名字,尽量用一个复数的单词来命名(根据你的主model)。

参考:Two Scoops of Django 1.11

国内有哪些 Django牛人?有一段时间,整个圈子都在转一篇文章,或者更准确地说,是一篇演讲的内容。我是一个平庸的程序员,我的大多数同龄人也是如此。平庸不是争论,而是更好的学习。大师的神化对整个编程社区并不是很有帮助,甚至是有害的。而我们应该有一颗心,不要沉迷于轻蔑的链条,不要怀疑我们是否是真正的程序员,能做的是心和责任去做事情。

这篇文章(演讲)将会广泛传播,主要是因为它是著名的Python框架Django的作者之一,Django是业界伟大的上帝。这篇文章第一次看到是早上,同事又读非常感动,其原因可能是,作为一个整体的大学(法律)唯一一个无赖的学生写代码,没有比较,只能读和写Wordpress(皮肤)不断练习编程,唯一的希望就是变成一个60分的web开发人员——服务器操作,后端应用程序,前端代码,设计、现场操作,或者只是——网站管理员,或者美悦名字——所有堆栈工程师。但我没有转向那篇文章,因为我从来都不想成为一个平庸的程序员,也不想平庸的去解决不努力的名字,真正应该做的是定义牛逼的角色程序员,心有不竭的追求。

多年来,很多人都问过我,你认为谁更强大。我很荣幸能成为中国最好的前端团队,我有幸留在了最优秀的代码追求团队中,我很幸运地创建了一个团队。参与并组织大型和小型会议,满足或谦虚或自负地站在行业顶端的程序员。写博客是在很多领域结识朋友的好方法。这是一个会议的过程。这个定义伴随着一个思考过程。古人有云:修身、齐家、平天下。把技术带回家,不要担心完成工作。凝聚团队,凝聚人心,以集体力量实现平台,建立信仰体系,是家庭;通过个人、团队甚至是世界的大组织的影响来影响整个社区。我总是试图用同样的方式来回答这些人的问题。

说了这么多,这也是对商业现象的一个参考,再一次,感觉,定义,为什么?想要在很长一段时间内写标题,因为经常听到有人用形容词而不是实际的内容来判断一些人的好坏,而事实上这不是一个好的现象,今天又看到了开玩笑的戏谑。因为这是一个玩笑,刚醒来就有了精神,想说两句话。

实际上,我不知道Po在说什么,但我在想ruan yifeng。阮先生和我从来没有见过他的文章,他翻译了黑客和画家,他偶尔会发消息,也听到很多人用英语写的“JavaScript继承”。最近团队提升了ES6, ES6的介绍来自他的书,非常好。当我听说yubo的团队时,我觉得很感动,我可以招募他。

他总是写,写和传播给读者,高阶的基础,深入浅薄,写作恰到好处。有争议和错误。这些错误就像对广东人说“冬天来了,燕子飞向南方”。他的一些同事没有提到这一点。他不是写了一篇不好的文章吗?在我看来,他处于世界的水平,不仅仅是写作,而是把“我们所知道的”变成“我们所做的”——告诉社区。在我看来,这是最受尊敬的牛逼程序员之一。

剩下的就不多说了。回到雅各布的演讲开始——我们应该有,并且不要沉溺于对链条的蔑视,不要怀疑自己是真正的程序员,能做的是用心和责任去把事情做好。

如果你是一个优秀的程序员,那么——尽你最大的努力,没有人比你更优秀,也不是一项通过的任务;把代码分发出去,填满你的GitHub主页,构建车轮,填满你的博客。把思想带到社区,利用微博和行业会议,让今天的顶级技术和实践成为明天最基本的介绍。所以,你是一个真正的程序员。

“django”是什么意思?有以下四种意思!英语里面单词的意思你要结合语句及文章,因为每个单词都有多种意思,你看你要的是哪一种1.而姜戈寿喜烧是一种日式火锅,而姜戈(django)则是著名西部片《django》中的主人公。关于为什么会选择“姜戈”作为标题,2.带来干净实效的设计django带来干净实效的设计…django严谨的维护干净的设计,它所有的代码让你开发的Web程序遵循最佳实践3.具有所有这些特点去除你的程序瑕疵…django具有所有这些特点…django是一个用Python写的,Python是一门优雅,简明,高级的编程语言4.提供快速开发django提供快速开发…django的哲学就是竭尽所能提升开发速度

django是做什么的?Django是基于Python的免费和开放源代码Web框架,它遵循模型-模板-视图(MTV)体系结构模式。它由Django Software Foundation(DSF)维护,这是一个由非营利组织成立的独立组织。

Django的主要目标是简化复杂的,数据库驱动的网站的创建。该框架强调组件的可重用性和“可插入性”,更少的代码,低耦合,快速开发以及不重复自己的原则。整个过程都使用Python,甚至用于设置文件和数据模型。Django还提供了一个可选的管理创建,读取,更新和删除界面,该界面通过自省动态生成并通过管理模型进行配置。

一些使用Django的知名网站包括公共广播服务,Instagram, Mozilla,华盛顿时报, Disqus,Bitbucket,和Nextdoor。

Django创建于2003年秋天,当时《劳伦斯日报》世界报纸的网络程序员Adrian Holovaty和Simon Willison开始使用Python来构建应用程序。西蒙·威利森(Simon Willison)的实习期结束前不久,雅各布·卡普兰·莫斯(Jacob Kaplan-Moss)在Django的发展中就被聘用了。它于2005年7月在BSD许可下公开发布。该框架以吉他手Django Reinhardt的名字命名。2008年6月,宣布新成立的Django软件基金会(DSF)将来将维护Django。

2015年7月,与一些Django联合创始人和开发人员建立联系的软件咨询公司Revolution Systems在劳伦斯举办了10周年纪念活动。

Django的设计理念如下:

松耦合——Django的目标是使堆栈中的每个元素彼此独立。

更少的编码——更少的代码,因此可以快速开发。

不重复自己(DRY)——一切都应该只在一个地方开发,而不是一次又一次地重复。

快速开发——Django的理念是尽一切可能促进超快速开发。

简洁的设计——Django严格按照自己的代码维护简洁的设计,并易于遵循最佳的Web开发实践。

Django的一些优势如下:

对象关系映射(ORM)支持——Django在数据模型和数据库引擎之间建立了桥梁,并支持包括MySQL,Oracle,Postgres等在内的大量数据库系统。

多语言支持——Django通过其内置的国际化系统支持多语言网站。因此,您可以开发支持多种语言的网站。

框架支持——Django内置了对Ajax,RSS,缓存和其他各种框架的支持。

GUI——Django为管理活动提供了一个很好的即用型用户界面。

开发环境——Django带有轻量级的Web服务器,以促进端到端应用程序的开发和测试。

Django是Python Web框架。和大多数现代框架一样,Django支持MVC模式。

关于Python的基础问题可以看下这个网页的视频教程,网页链接,希望我的回答能帮到你。

Django什么情况在朋友和同事的极力推荐下最近开始看上了python,其实主要是还是因为python是2007年度语言,怎么的也要与时俱进呀.最近一路看来有些心得,希望能与大家分享,小弟其实也只接触不到一周的python,有说错的地方还望大家指出改正.

不打算从py的语法基础说起了,直接说说对django的心得:

接触django首先需要了解可能就是他那个model,建立一个model就什么都有了,这对于搞java得人员来说还是挺有吸引力的(当然貌似对于动态语言这都是小儿科),那么让我们先看一个model的例子:

偷懒了,直接拿django-admin里面的User出来了

class User(models.Model):

username= models.CharField(_(‘username’), maxlength=30, unique=True, validator_list=[validators.isAlphaNumeric]))

first_name= models.CharField(_(‘first name’), maxlength=30, blank=True)

last_name= models.CharField(_(‘last name’), maxlength=30, blank=True)

email= models.EmailField(_(‘e-mail address’), blank=True)

password= models.CharField(_(‘password’), maxlength=128))

class Meta:

ordering=(‘username’,)

每个属性就是一个库表的字段,定义起来非常简单明了,models里面提供了很多种类的Field类似上面的EmailField。不同的Field有不同的设置,可以看相应的原来来了解相关的设置.

在model class内部还有一个class Meta,这个Class的属性制定了这个表的一些存取策略,例如这里的ordering。MetaClass里面的属性可以用model的_meta属性取得。OK,那么这样一个model怎么就能实现对数据库表的灵活操作了呢。让我们来看看吧。

首先先分析一下/django/django/db/models/base.py这个文件,其中包含了models.Model这类的定义:

看看class定义的第一行吧,第一行就够我琢磨一阵子的了:

class Model(object):

__metaclass__= ModelBase

Model采用了new style class定义,关于这个内容大家可以放狗看一下,第一行是一个__metaclass__属性的定义,该属性的值是ModelBase,这是一个类。__metaclass__的意思是,指定一个class,这个class的实例就是本class,相信您已经晕了。那么就拿这个Model的例子来说明一下,如果没有__metaclass__这个属性,产生一个实例就是正常的流程,有了这个属性流程会有改变:

首先调用BaseModel.__new__(cls, name, bases, attrs)这个方法,回返回的值是一个class类型,然后用这个class来创建实例。其实BaseModel就是Model的元类,来制定Model这个类的最终样子。关于元类的更多信息请看这里

那么我们的目光一下转移到BaseModel这个类上,我有种直觉,Meta这个class最后可以用_meta来取就是在这里做的手脚,看一下BaseModel的定义吧,有点长:

class ModelBase(type):

“Metaclass for all models”

def __new__(cls, name, bases, attrs):

# If this isn’t a subclass of Model, don’t do anything special.

if name==’Model’ or not filter(lambda b: issubclass(b, Model), bases):#1

return super(ModelBase, cls).__new__(cls, name, bases, attrs)

# Create the class.

new_class= type.__new__(cls, name, bases,{‘__module__’: attrs.pop(‘__module__’)})#2

new_class.add_to_class(‘_meta’, Options(attrs.pop(‘Meta’, None)))#3

new_class.add_to_class(‘DoesNotExist’, types.ClassType(‘DoesNotExist’,(ObjectDoesNotExist,),{}))

# Build complete list of parents#4

for base in bases:

# TODO: Checking for the presence of’_meta’ is hackish.

if’_meta’ in dir(base):

new_class._meta.parents.append(base)

new_class._meta.parents.extend(base._meta.parents)

model_module= sys.modules[new_class.__module__]

if getattr(new_class._meta,’app_label’, None) is None:

# Figure out the app_label by looking one level up.

# For’django.contrib.sites.models’, this would be’sites’.

new_class._meta.app_label= model_module.__name__.split(‘.’)[-2]#5

# Bail out early if we have already created this class.

m= get_model(new_class._meta.app_label, name, False)#6

if m is not None:

return m

# Add all attributes to the class.

for obj_name, obj in attrs.items():

new_class.add_to_class(obj_name, obj)#7

# Add Fields inherited from parents

for parent in new_class._meta.parents:

for field in parent._meta.fields:

# Only add parent fields if they aren’t defined for this class.

try:

new_class._meta.get_field(field.name)

except FieldDoesNotExist:

field.contribute_to_class(new_class, field.name)#8

new_class._prepare()

register_models(new_class._meta.app_label, new_class)#9

# Because of the way imports happen(recursively), we may or may not be

# the first class for this model to register with the framework. There

# should only be one class for each model, so we must always return the

# registered version.

return get_model(new_class._meta.app_label, name, False)#10

简单分析一下这个代码:

1.检查class是否为Model的子类,不是的话,不做任何处理,直接传给父类处理,也就相当于正常的处理了class,注意super在多重继承的时候应该严格使用

2.用type来创建类,创建的就是正常的ModelClass

3.这句很重要,add_to_class是Model里面的class方法,这个方法其实就是传入name和value,给Model添加class属性.看到了,原来神奇的_meta就是这么来的.提到add_to_class方法,简单看一下它的代码:

def add_to_class(cls, name, value):

if name==’Admin’:

assert type(value)== types.ClassType,”%r attribute of%s model must be a class, not a%s object”%(name, cls.__name__, type(value))

value= AdminOptions(**dict([(k, v) for k, v in value.__dict__.items() if not k.startswith(‘_’)]))

if hasattr(value,’contribute_to_class’):

value.contribute_to_class(cls, name)

else:

setattr(cls, name, value)

add_to_class= classmethod(add_to_class)

最后一句是制定这个方法是class方法,特点就是方法的第一个参数是本class,其实classmethod就是一个装饰器,在2。4之后可以使用@来简写。这里不得不提的是他对Admin的特殊处理,虽然AdminOption不是在admin模块里面的,但是这么做还是跟一个Admin的东东绑定起来了,在java的世界解耦是一件大事,看到下面还有对’contribute_to_class’这个方法的特殊处理,django为啥不弄的解耦点呢。而且同样是包装成Option,一个是在BaseModel里面弄(那个Meta的包装),一个在add_to_class方法里面弄,实在有点不优雅,可能还没了解太多,不知道他的深度用意吧。

4. Meta的集成,Option的这个类提供继承方法

5.取得applabel,就是把model的名字分割取到数第二个,我很喜欢-2这样的设定

6. get_model方法取得缓存里面的东西。

7.把所有的class attr拿出来搞一遍,一般的属性就setattr弄回去了,要是这个属性有contribute_to_class这个callable属性,那就执行之(Admin的处理完全也可以这样,其实我们常用的objects就是用这个方法弄的)

8.每个Field调用自己的contribute_to_class方法来进行特殊的处理

9.进入缓存,,暂且叫缓存吧,里面的东西大家看看很简单文件在/django/django/db/models/loading.py里面还是有很多内容的

10.看注释说的很清楚了,我们一定要在缓存里面拿model。

结语:以上就是首席CTO笔记为大家整理的关于django名字怎么样的相关内容解答汇总了,希望对您有所帮助!如果解决了您的问题欢迎分享给更多关注此问题的朋友喔~

© 版权声明
THE END
喜欢就支持一下吧
点赞7 分享