wagtail cms_为Wagtail做准备,这是迄今为止最好的Django CMS

wagtail cms

现在, Wagtail CMS正在为其1.0版本做准备,我想花一些时间向您介绍当前可用的所有最佳,最灵活的Django CMS。 g已经出现了一段时间,但似乎没有引起我的重视。

Revolution Systems ,我们最近在许多项目中使用了Wagtail,整体经验非常好。 它在使容易的事情变得容易和不容易的事情(不仅可能而且相对容易)之间取得了适当的平衡。

功能亮点

  • 非技术的最终用户放心。 具有出色的UI / UX的自定义管理员
  • 与您网站上的所有其他Django应用程序一起很好地播放
  • 轻松的管理员自定义和品牌
  • CMS模型的灵活性,不仅可以拥有“页面”,还可以处理更多结构化数据
  • 内置表单生成器系统
  • 出色的图像和文档/文件支持以及用户界面
  • StreamField具有最大的灵活性,可让您定义和组织小块内容
  • 能够组织管理标签和字段布局
  • 可以在某些URL下添加什么页面模型的控制/灵活性
  • 钩入ElasticSearch进行搜索
  • 与Varnish和静态站点生成器兼容,以帮助实现大规模性能

管理界面

面对现实,Django管理员还有很多不足之处。 它是面向CRUD的,并且除了技术含量最高的用户之外,其他所有用户都感到困惑。 即使使用Django Suit之类的包进行了改头换面,或者完全将其替换为Grappelli这样的包,也并不是最终用户真正想要的。 不要误会我的意思:这两个软件包都很棒,您应该将它们检出,但是它们根本无法克服试图自定义Django管理员超出特定点所带来的所有障碍。

Wagtail带有自己的自定义管理界面,开箱即用,专门针对典型的CMS工作流程而设计。 观看有关Wagtail的精彩宣传视频 ,您会明白我的意思。 不认真,去看它。 我会等。

那不是很好看吗? 第一次观看Wagtail视频时,我的第一个念头是:“很好,但是我敢打赌,自定义这是一个巨大的痛苦……”。 值得庆幸的是,无论如何我还是给了它一个转折,后来发现自定义Wagtail管理员实际上非常简单。

文档中有出色的编辑指南,这是大多数最终用户入门所需的全部内容。 到目前为止,我们唯一使用户感到困惑的是资源管理器,根页面和页面的层次性质。 即便是那些小问题,只要与用户快速聊天,他们就会不屑一顾,并且正在前进。

哦,这笔巨款管理员可在手机和平​​板电脑上惊人地使用!

Wagtail admin user interface

自定义Wagtail管理员的方法

您可以通过几种方式自定义管理员。 首先,您只需进行一些配置即可确定哪些字段对用户可见以及在界面的哪个选项卡上可见。 考虑一下您将要进行的“定制”的基本输入级别。

自定义管理员的商标也是一个经常的需求。 技术人员通常看不到重点,但是如果您可以暂时戴上最终用户的帽子,这似乎很奇怪,并且常常使进入www.revsys.com的登录页面变得混乱,该页面显示为“欢迎使用Wagtail CMS Admin。 ” 如果安装django-overextends ,则可以轻松自定义 CMS使用的徽标,登录消息和欢迎消息,以符合用户的期望。

对我来说,这两个自定义选项是我对CMS的期望; 然而,鹡鸰更进了一步,让您挂钩 ,允许更丰富的定制。 您可以执行以下操作:

  • 将项目添加到Wagtail用户栏中,该页面在页面右侧为登录用户显示,非常类似于Django Debug Toolbar
  • 从Wagtail主管理主页添加或删除面板
  • 从首页添加或删除摘要项(页面,文档,图像等)
  • 使用挂钩进行后台操作,或者在创建,编辑或删除页面后想要自己的自定义响应
  • 添加您自己的管理菜单项,可以转到所需的任何Django视图或异地URL。
g管理员侧边栏

我使用了最后一种功能来在TEDxLawrence.com上成功添加管理菜单项。 我们需要发言人委员会查看发言人的意见,投票和发表意见的方法。 我没有尝试将所有这些东西都塞入Django Admin甚至Wagtail Admin的世界中,而是简单地链接到完全自定义的基于类的视图,以提供完整的端到端控制。

大多数内容管理系统围绕通常具有标题的页面概念, 页面的某种简短描述以及页面内容本身进行操作。 许多工具都提供了不错的所见即所得(WYSIWYG)编辑工具,使添加标题,列表,粗体和斜体等操作相对容易。

当您要在页面上表示的内容不完全适合此数据模型时,就会出现问题。 您是否只是将其推入内容字段? 也许您的CMS具有笨拙的机制,可以将其他内容关联到页面或通过某些插件系统。 也许您只是运气不好,无法正常工作,并从模板中使用javascript加载了一些东西。

使用Wagtail,您可以构建从其Page模型继承的自己的模型。 这样,您就可以为特定数据自定义特定字段,并最终消除了许多惯用的技巧,以使您的数据概念适合CMS的世界视野。

这可能是最好的例子。 让我们构建两种不同类型的页面。 一个简单的博客类型页面和一个更复杂的“职员”页面可能会用于单个职员。

我们的简单页面如下所示:



   
   
from django. db import models
from wagtail. wagtailcore . models import Page
from wagtail. wagtailcore . fields import RichTextField
from wagtail. wagtailadmin . edit_handlers import FieldPanel

class BlogPage ( Page ) :
    sub_title = models. CharField ( max_length = 500 , blank = True )
    published = models. DateField ( )
    author = models. CharField ( max_length = 100 )
    summary = models. RichTextField ( blank = True )
    body = models. RichTextField ( )
    closing_content = models. RichTextField ( blank = True )

    content_panels = [
        FieldPanel ( ‘title’ ) ,
        FieldPanel ( ‘sub_title’ ) ,
        FieldPanel ( ‘published’ ) ,
        FieldPanel ( ‘author’ ) ,
        FieldPanel ( ‘summary’ ) ,
        FieldPanel ( ‘body’ ) ,
        FieldPanel ( ‘closing_content’ )
    ]

Wagtail会自动为您设置一些字段,例如标题,页面的标签,开始/结束可见性时间以及SEO /元相关的字段,因此您只需要定义那些字段即可。

在这里,我们定义了一些我们希望在博客文章中获得的其他结构化信息。 可能的副标题和摘要信息,作者,条目的发布日期以及通常的正文字段。 我们还添加了一个额外的close_content字段,可用于结束行动或我们希望突出显示在帖子下方的其他内容。

您需要做的就是将其添加到Django应用程序的models.py中,运行makemigrations并进行迁移 ,一切顺利。

现在,让我们制作一个稍微复杂一些的职员页面:



   
   
DEPARTMENT_CHOICES = (
    ( ‘admin’ , ‘Administration’ ) ,
    ( ‘accounting’ , ‘Accounting’ ) ,
    ( ‘marketing’ , ‘Marketing’ ) ,
    ( ‘sales’ , ‘Sales’ ) ,
    ( ‘engineer’ , ‘Engineering’ ) ,
)

class StaffPage ( Page ) :
    first_name = models. CharField ( max_length = 50 )
    last_name = models. CharField ( max_length = 50 )
    active = models. BooleanField ( default = True )
    start_date = models. DateField ( )
    end_date = models. DateField ( blank = True , null = True )
    department = models. CharField ( max_length = 50 , choices = DEPARTMENT_CHOICES )
    email = models. EmailField ( )
    twitter = models. CharField ( max_length = 50 )
    short_bio = models. RichTextField ( blank = True )
    bio = models. RichTextField ( blank = True )
    education = models. RichTextField ( blank = True )
    work_history = models. RichTextField ( blank = True )

    # Panel options left out for brevity

如您所见,StaffPage模型具有更多字段,其中大多数字段都是可选的,这使Staff成员可以随着时间的推移更新其信息,而不会陷入将“即将到来的生物”放入其他必填字段的麻烦。

很简单,对吧? 您可能会认为有一些陷阱。 幸运的是,你错了。 真的就这么简单。 简单的事情容易吧?

Wa更难的事情

那么,Wa是什么难事呢? 好吧,一般来说,这只是对系统的熟悉。 可能会使您绊倒的几件事是:

  • 您的派生模型上不能有一个名为url的字段,因为Wagtail在父级Page模型中使用了该字段名称。 不幸的是,如果您确实添加了一个(我已经做过比我想承认的要多得多的次数),那么您会得到一个不是非常有用的错误“ 无法设置属性 ”,并且没有太多其他事情要做。
  • 在许多列表类型页面上,可以按时间顺序简单地显示所有项目并进行分页。 其他时候,用户希望能够手动管理给定页面上显示的内容。 Wagtail使此操作相对容易,因为您可以使用直通类型模型定义与其他页面的ForeignKey关系,并使用PageChoosePanel为用户提供一个不错的界面来执行此操作。 用户还可以直接在管理员中手动订购它们,而无需其他工作。
  • 通过在子模型上设置一个名为parent_page_types的列表,可以限制可以将哪些页面创建为子页面(也称为页面下方)。 然后,只能将其添加到这些已定义类型的页面下方。 在具有许多不同页面类型的复杂站点上,这有助于将“页面选择和创建”选项选择保持在用户可管理的水平。 显然,它还有助于防止用户在网站的错误部分中创建错误类型的页面。
  • Wagtail目前没有关于为您构建导航菜单的好故事,但是有十二个可重复使用的Django应用程序可以帮助您解决这一问题。 通常,网站的菜单保持相对静态,并且每天都不会进行编辑。
  • 使用相同的CMS支持多个站点。 这在技术上并不难,但在概念上更难理解。 Wagtail通过其wagtailsites应用程序支持拥有多个站点。 它的工作方式是,您只需为每个主机名设置“ Root”页面,并且基本上从那里获取它。 但是,在大多数情况下,仅拥有两个不同的Wagtail实例并使用不同的数据库可能更容易,更清洁。

图片和文件

文档是您希望能够上载到系统中的任何类型的文件。 这可以处理用户需要上载PDF,Excel或Word文档并能够从任何其他内容链接到该文档的任何情况。

图片正是您的想法; 但是,如果您选择并为版权,许可,署名甚至是EXIF数据之类的内容附加字段,则可以为此定义自己的基本模型。

Documents和Images都通过django-taggit提供了标记支持,并且在管理界面中为它们设计了非常好的外观和UX。

是的,在您提出要求之前,它已经内置了对模板中灵活缩略图的支持,并且可以手动定义图像中的主要焦点,从而避免了怪异的裁剪。

Wagtail image user interface

表单生成器界面

Wagtail还内置了一个不错的表单生成器 ,可以轻松满足您典型的联系表单场景或更复杂的收集需求。

与Pages一样,您只需从Wagtail继承子类,然后定义要收集的字段。 在模型上,您还可以覆盖process_form_submission方法以进行更复杂的验证,或者在更常见的情况下,通过电子邮件向感兴趣的各方发送电子邮件,告知他们有新的提交。

内置的表单生成器的一大功能是查看和下载界面。 查看输入的数据非常棒,但是您只知道您的用户将想要拉出数据并将其用于其他目的。 Wagtail可以很好地预料到这一点,并允许用户随时按日期范围将提交的数据下载为CSV文件。

片段

g片段是不是完整网页的可重用内容。 通常,这些内容用于侧边栏内容,广告或号召性用语。

与Pages或Forms不同,您无需为模型创建子类,而是定义模型并将其注册为摘要。 然后,您可以随意为用户提供将所需类型的代码片段附加到其他页面的选项。 或者,如果您只是想让他们能够编辑诸如页脚内容之类的功能,则可以手动添加代码段数据,而代码段管理界面实际上就是他们的编辑界面。

最大的特点? 内容流

能够使用自己的字段定义自己的Page类型很长的路要走,但与真正的自由格式内容相比,这是一个很大的延伸。 Wagtail的杀手级功能StreamField是1.0版中的新增功能。

用户需要自由格式的内容,而开发人员,设计人员甚至操作人员都需要结构良好的数据。 StreamFields满足两个阵营。

在页面上定义StreamField时,您可以设置哪些类型的可添加到该流中。 块可以像文本的CharField一样简单,也可以像上面使用结构块类型的Staff类型记录一样复杂。

然后,最终用户可以添加各种类型的几个标题,一些富文本内容块,并将其全部散布在一些图像和代码块中。 然后,您定义的每种块类型都可以使用不同CSS样式和/或在需要时使其标记的结构完全不同。

在将此功能添加到1.0之前,我不得不求助于复杂的Page关系,而这些关系实际上并不是我们打算在网站上显示的页面。 我们只是颠覆了Wagtail的“页面选择”功能,以便为用户提供所需的灵活性,并将其全部保留在同一管理界面中。

这是StreamFields的管理UI外观。 在这里,我们定义了一个名为Body的字段,该字段具有标头,内容和代码块类型。 这些中的每都是不同的块。 顶部和底部是标题。 如您所见,您只需单击加号图标即可在其他之间添加新块,或使用右侧的箭头在周围移动块。 由于CSS漏洞(我预计很快会修复),因此目前很难看到它们。

Content streams

g的未来

我认为Wagtail的总体前景非常光明,尤其是在Django社区内部。 但是,就像任何1.0产品一样,我肯定会在将来的版本中看到一些东西。 我希望看到的两件事是:

  • 一个高质量,灵活的通用页面和块类型的社区集合,使大多数站点比起编码站点,更像是乐高游戏。
  • 编辑内容时,可以更轻松地自定义和控制显示在屏幕底部的“发布/审核/另存为草稿”选项。 在许多较小的网站或工作流程平坦的网站上,将“发布”或“提交审核”作为呈现给用户的默认操作应该很简单。

本文最初出现在RevSys博客上

翻译自: https://opensource.com/business/15/5/wagtail-cms

wagtail cms

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值