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
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名字怎么样的相关内容解答汇总了,希望对您有所帮助!如果解决了您的问题欢迎分享给更多关注此问题的朋友喔~






