织梦内容管理系统(DedeCMS)允许用户在内容模型里添加自定义字段,用来存储标准字段之外的信息,例如商品编号、下载链接或副标题。很多站长建好字段后在模板里写标签却拿不到数据,根本原因是对织梦的字段解析机制不清楚。织梦的自定义字段并非全局自动暴露,而是要根据页面类型使用不同的调用方式。理解这一点,才能避免在模板里写一堆无效标签。

内容页中直接调用自定义字段的方法
在织梦的文章内容页(即显示单篇文档的模板,如 article_article.htm)中,自定义字段的调用最为简单。系统在执行文档视图时,会把当前文档对应模型的所有字段(含自定义字段)赋值给模板变量。此时只需在模板里使用大括号包裹字段名即可,例如字段名为 goods_price,那么写法就是 {dede:field.goods_price/}。这种写法不需要声明模型ID,也不需要额外参数,因为当前文档的模型上下文已经确定。
需要注意的是,字段名必须和后台模型里添加的“字段名称”完全一致,而不是“表单提示文字”。很多初学者在后台看到“商品价格”就写 {dede:field.商品价格/},结果输出空白。另外如果内容页采用动态浏览(未生成HTML),要确保后台已开启相关权限,且字段在数据库中确实写入了值。下面是一段内容页调用多个自定义字段的示例:
<div class="product">
<h1>{dede:field.title/}</h1>
<p>价格:{dede:field.goods_price/} 元</p>
<p>货号:{dede:field.goods_sn/}</p>
<p>说明:{dede:field.body/}</p>
</div>
如果字段是联动类型或者附件类型,内容页直接调用输出的是原始值(如联动的枚举值或文件路径),若要显示为文字描述,往往需要配合额外的标签或PHP逻辑。但基础的文本、数字字段用上述方式就能稳定输出。当发现字段值为空时,先到后台内容管理里点开该文档,确认自定义字段输入框不是空白,再检查模板字段名拼写。
列表页通过arclist调用自定义字段
在首页、栏目页或其他列表场景中,我们常用 arclist 标签循环输出多篇文章。默认情况下 arclist 只查询系统主表与附加表的部分固定字段,不会自动带上自定义字段。要在列表里取出自定义字段,必须给标签加上 addfields 和 channelid 两个属性。addfields 用来声明要额外取出的字段名,多个用逗号隔开;channelid 则是内容模型的ID,普通文章模型通常是 1,其他模型在后台模型管理里能看到编号。
例如我们有一个商品模型,channelid 为 17,自定义字段为 goods_price 与 goods_sn,那么列表调用代码应写成如下形式。这样织梦在查询时就会把附加表中对应字段 join 进来,并在 field 子标签中可用。
{dede:arclist typeid='5' row='10' channelid='17' addfields='goods_price,goods_sn'}
<li>
<a href="[field:arcurl/]">[field:title/]</a>
价格:[field:goods_price/] 元
货号:[field:goods_sn/]
</li>
{/dede:arclist}
这里容易踩的坑是 channelid 填错。如果填成 1(文章模型),而该栏目实际是商品模型,字段就会为空甚至报错。另一个坑是字段不在当前栏目对应的模型里,比如栏目A用文章模型,你却要调出商品模型的字段,这需要在 typeid 和 channelid 上做精确匹配。还有一种情况是用了 list 标签(栏目列表页专用)而非 arclist,list 标签同样支持 addfields 和 channelid,写法类似,但要注意 list 标签默认基于当前栏目,不需要写 typeid。
常见调用失败原因与排查思路
实际项目中自定义字段调不出来,多半集中在几个固定原因。第一,没有生成静态文件。织梦在生成HTML时才会把标签解析成真实数据,如果你改了模板或加了字段,却直接刷新浏览器看旧页面,当然看不到新内容。后台“更新系统缓存”和“生成静态页面”两步都要做。第二,字段类型为多媒体或图片时,直接调用输出的是类似 /uploads/1.jpg 的字符串,若模板里没写 img 标签包裹,前台就只显示路径文字,容易被误以为调用失败。
第三,在跨模型调用时忽略了权限与表前缀。织梦的自定义字段存于不同模型的附加表(如 dede_addonarticle、dede_addonshop),arclist 的 channelid 决定了 join 哪张表。如果数据库里表名被修改过,或使用了多站点分离,就需要检查表是否存在。第四,部分二次开发过的织梦版本对 addfields 做了限制,需要在系统基本参数里开启“允许跨模型字段调用”。下面给出一个简单的排查清单:
- 确认后台模型里字段已创建且文档已填写该字段值
- 内容页用
{dede:field.字段名/},列表页用addfields加channelid - 重新生成对应栏目与文档的静态页
- 检查模板中是否把标签写在了
arclist循环内部 - 查看网页源代码,确认是空白还是输出了路径类原始值
当以上都确认无误但仍无效,可以临时开启织梦的模板引擎调试(在 include 目录下相关文件加日志),看解析后的SQL是否包含自定义字段。通常问题都出在 channelid 不匹配或忘记生成。掌握这些排查方法后,织梦自定义字段的调用就不再神秘,可以支撑起绝大部分建站时的个性化数据展示需求。