{dede:datalist} 是一个非常灵活的列表标签,它不像 {dede:arclist} 那样有固定的字段名(如 [field:picname/]),而是直接循环输出你指定的数据表中的任意字段,正确使用它的关键在于理解你的数据结构。

核心概念:{dede:datalist} 与 {dede:arclist} 的区别
| 特性 | {dede:datalist} |
{dede:arclist} |
|---|---|---|
| 数据来源 | 任意数据表(需指定 table 属性) |
默认为 dede_archives(主表)+ 关联的附加表 |
| 灵活性 | 极高,可查询任意表的任意字段 | 较低,字段名基本固定,如 title, litpic, pubdate |
| 常用场景 | 调用自定义模型数据、特定栏目文章、外部数据等 | 调用普通文章、图集等默认内容 |
| 字段调用 | [field:自定义字段名/] |
[field:picname/] (缩略图), [field:title/] (标题) 等 |
如果你只是想调用文章列表,用 {dede:arclist} 更方便,但如果你的数据不在 archives 表里,或者你需要更复杂的查询,{dede:datalist} 就是你需要的工具。
调用文章的缩略图(最常见)
文章的缩略图信息存储在 dede_archives 表的 litpic 字段中。
步骤 1:确定查询条件
{dede:datalist} 默认会查询 dede_archives 表,但你必须告诉它要查询哪些记录(比如哪个栏目下的文章),这通常通过 typeid 和 row 等属性来实现。
typeid: 指定栏目ID,只调用该ID及其子栏目下的文章。row: 调用的记录条数,len`: 标题长度。
步骤 2:编写模板代码
在模板文件中(如 list_article.htm),使用以下代码:

{dede:datalist typeid='栏目ID' row='10' titlelen='30'}
<li>
<!-- 1. 调用缩略图 -->
<a href="[field:arcurl/]" title="[field:title/]">
<img src="[field:litpic/]" alt="[field:title]" />
</a>
<!-- 2. 调用标题 -->
<a href="[field:arcurl/]" title="[field:title/]">[field:title/]</a>
<!-- 3. 调用发布时间 -->
<span>[field:pubdate function="MyDate('Y-m-d', @me)"/]</span>
</li>
{/dede:datalist}
代码解释:
{dede:datalist typeid='栏目ID' row='10'}: 调用指定栏目下的10篇文章。[field:litpic/]: 这就是调用图片地址的核心。litpic是archives表中存储缩略图路径的字段名。[field:arcurl/]: 调用文章的链接地址。[field:title/]: 调用文章标题。[field:pubdate function="MyDate('Y-m-d', @me)"/]: 调用发布时间,并用function修饰符格式化为年-月-日的格式。
调用自定义模型中的图片字段
这是 {dede:datalist} 大显身手的地方,假设你创建了一个“产品”自定义模型,并添加了一个名为 product_pic 的图片类型的字段。
步骤 1:确定数据表和字段名
- 主表:
dede_archives(存储标题、发布时间等基本信息) - 附加表:
dede_product_addon(假设你的模型ID是10,附加表名通常为dede_模型ID_addon) - 图片字段:
product_pic(你在模型中定义的字段名)
步骤 2:编写模板代码
你需要使用 table 属性来指定要查询的附加表。
{dede:datalist table='dede_product_addon' typeid='产品栏目ID' row='8'}
<div class="product-item">
<!-- 1. 调用自定义图片字段 -->
<a href="[field:arcurl/]">
<img src="[field:product_pic/]" alt="[field:title function='html2text(@me)'/]" />
</a>
<!-- 2. 调用标题 (标题在主表archives中,datalist默认可以跨表获取) -->
<h3><a href="[field:arcurl/]">[field:title/]</a></h3>
<!-- 3. 假设你还有个简介字段 intro_text -->
<p>[field:intro_text/]</p>
</div>
{/dede:datalist}
代码解释:
{dede:datalist table='dede_product_addon' ...}: 明确告诉织梦,我们要从dede_product_addon这个表中取数据。[field:product_pic/]: 直接调用附加表中product_pic字段的值,即图片地址。[field:arcurl/]和[field:title/]: 即使typeid指向了附加表,datalist仍然会自动关联archives主表来获取文章链接和标题,这非常方便。
调用图集(特殊处理)
图集(dede_archives.typeid = 2)的图片存储方式比较特殊,图片地址被序列化后存储在附加表的 body 或 pics 字段中,并且有对应的 pagepic 表。
场景1:调用图集列表,只显示第一张图作为封面
这和方法一类似,直接使用 litpic 字段即可,因为织梦在保存图集时会自动将第一张图设置为封面。
{dede:datalist typeid='图集栏目ID' row='6'}
<li>
<a href="[field:arcurl/]" title="[field:title/]">
<!-- 调用图集封面,通常是第一张图 -->
<img src="[field:litpic/]" alt="[field:title]" />
</a>
<p>[field:title/]</p>
</li>
{/dede:datalist}
场景2:调用图集,并显示图集内的所有图片
这需要使用 {dede:productimagelist} 标签,它必须嵌套在 {dede:datalist} 或 {dede:arclist} 内部使用。
{dede:datalist typeid='图集栏目ID' row='3'}
<div class="album">
<h3><a href="[field:arcurl/]">[field:title/]</a></h3>
<div class="album-list">
<!-- 嵌套 productimagelist 来循环图集内的图片 -->
{dede:productimagelist}
<a href="[field:imgsrc/]" title="[field:text/]">
<img src="[field:imgsrc/]" alt="[field:text/]" />
</a>
{/dede:productimagelist}
</div>
</div>
{/dede:datalist}
代码解释:
{dede:productimagelist}: 专门用于循环图集内部图片的标签。[field:imgsrc/]: 调用图集中单张图片的地址。[field:text/]: 调用图片的描述文字。
总结与排错
- 先确定数据在哪张表:是普通文章(
archives),还是自定义模型(xxx_addon)? - 再确定字段名:图片字段叫什么?是
litpic,还是你自己定义的my_image? - 编写标签:
- 如果是普通文章,直接用
{dede:datalist typeid='X'}和[field:litpic/]。 - 如果是自定义模型,用
{dede:datalist table='xxx_addon' typeid='X'}和[field:你的图片字段名/]。
- 如果是普通文章,直接用
- 常见问题:
- 图片不显示:
- 检查
[field:字段名/]中的字段名是否正确。 - 检查后台该文章/内容是否真的上传了图片。
- 检查图片路径是否正确(是相对路径
/uploads/...还是绝对路径http://...)。 - 检查图片文件是否存在服务器上。
- 检查
- 调用不出内容:
- 检查
typeid是否正确,或者该栏目下是否真的有内容。 - 检查
table属性指定的表名是否正确。 - 检查SQL查询是否有语法错误(如果使用了
sql属性)。
- 检查
- 图片不显示:
希望这份详细的指南能帮助你彻底理解在织梦中使用 {dede:datalist} 调用图片的方法!
