如何在django cms中向页面添加一些额外字段?(在django管理面板中)

如何在django cms中向页面添加一些额外字段?(在django管理面板中),django,django-admin,django-cms,Django,Django Admin,Django Cms,我想在django cms(在django管理面板中)的页面中添加一些额外的字段。如何以最简单的方式实现这一点 创建一个新的应用程序(称为extended\u cms或其他什么),并在models.py中创建以下内容: from django.db import models from django.utils.translation import ugettext_lazy as _ from cms.models.pagemodel import Page class ExtendedPa

我想在django cms(在django管理面板中)的页面中添加一些额外的字段。如何以最简单的方式实现这一点

创建一个新的应用程序(称为
extended\u cms
或其他什么),并在
models.py中创建以下内容:

from django.db import models
from django.utils.translation import ugettext_lazy as _
from cms.models.pagemodel import Page

class ExtendedPage(models.Model):   
    page = models.ForeignKey(Page, unique=True, verbose_name=_("Page"), editable=False, related_name='extended_fields')
    my_extra_field = models.CharField(...)
然后创建一个
admin.py

from models import ExtendedPage
from cms.admin.pageadmin import PageAdmin
from cms.models.pagemodel import Page
from django.contrib import admin

class ExtendedPageAdmin(admin.StackedInline):
    model = ExtendedPage
    can_delete = False

PageAdmin.inlines.append(ExtendedPageAdmin)
try:
    admin.site.unregister(Page)
except:
    pass
admin.site.register(Page, PageAdmin)
它会将您的扩展模型作为内联添加到您创建的任何页面。访问扩展模型设置的最简单方法是创建上下文处理器:

from django.core.cache import cache
from django.contrib.sites.models import Site

from models import ExtendedPage

def extended_page_options(request):
    cls = ExtendedPage
    extended_page_options = None    
    try:
        extended_page_options = request.current_page.extended_fields.all()[0]
    except:
        pass
    return {
        'extended_page_options' : extended_page_options,
    }
现在,您可以使用模板中的
{{extended_page_options.my_extra_field}
访问当前页面的额外选项

基本上,您所做的是创建一个单独的模型,该模型带有额外的设置,用作每个CMS页面的内联。我从以前的一篇博客文章中得到了这个,所以如果我能找到,我会发布它

编辑


这是一篇博文:

还有一种方法可以做到这一点,无需使用内联命令,也无需在页面表单的任何位置设置字段。例如,我有一个“颜色方案”的自定义设置,我希望它位于“基本设置”字段集下。这可以通过重写ModelForm和ModelAdmin的字段集来实现。此外,为了简单起见,我选择了OneTone字段而不是ForeignKey

models.py

admin.py


我通过谷歌找到了这里,这些答案让我进入了Django CMS 3测试版的正确轨道。要扩展页面模型并将扩展连接到工具栏,可以按照官方文档进行操作:

模板中的访问值 要在模板中访问其值,请执行以下操作:

{{ request.current_page.showdefaultheaderextension.show_header }}

有一种官方方式可以扩展页面和标题模型,我强烈推荐以下官方文档:

  • 来自docs.django-cms.org
如果可以的话,我还强烈建议您使用占位符,因为写下这个答案,我现在更喜欢为封面图像的用例创建占位符。(即使你想,你也可以)

链接摘要:
  • models.py
    文件中创建
    PageExtension
    的子类并注册它:

    class IconExtension(PageExtension):
        image = models.ImageField(upload_to='icons')
    
    extension_pool.register(IconExtension)
    
    class IconExtensionAdmin(PageExtensionAdmin):
        pass
    
    admin.site.register(IconExtension, IconExtensionAdmin)
    
    @toolbar_pool.register
    class IconExtensionToolbar(ExtensionToolbar):
        model = IconExtension
    
        def populate(self):
            current_page_menu = self._setup_extension_toolbar()
            if current_page_menu:
                page_extension, url = self.get_page_extension_admin()
                if url:
                    current_page_menu.add_modal_item(_('Page Icon'), url=url,
                        disabled=not self.toolbar.edit_mode)
    
  • admin.py
    文件中创建
    PageExtensionAdmin
    的子类并注册它:

    class IconExtension(PageExtension):
        image = models.ImageField(upload_to='icons')
    
    extension_pool.register(IconExtension)
    
    class IconExtensionAdmin(PageExtensionAdmin):
        pass
    
    admin.site.register(IconExtension, IconExtensionAdmin)
    
    @toolbar_pool.register
    class IconExtensionToolbar(ExtensionToolbar):
        model = IconExtension
    
        def populate(self):
            current_page_menu = self._setup_extension_toolbar()
            if current_page_menu:
                page_extension, url = self.get_page_extension_admin()
                if url:
                    current_page_menu.add_modal_item(_('Page Icon'), url=url,
                        disabled=not self.toolbar.edit_mode)
    
  • 最后,要从工具栏访问它,请在
    cms\u toolbars.py
    中创建一个子类
    ExtensionToolbar
    ,并注册它:

    class IconExtension(PageExtension):
        image = models.ImageField(upload_to='icons')
    
    extension_pool.register(IconExtension)
    
    class IconExtensionAdmin(PageExtensionAdmin):
        pass
    
    admin.site.register(IconExtension, IconExtensionAdmin)
    
    @toolbar_pool.register
    class IconExtensionToolbar(ExtensionToolbar):
        model = IconExtension
    
        def populate(self):
            current_page_menu = self._setup_extension_toolbar()
            if current_page_menu:
                page_extension, url = self.get_page_extension_admin()
                if url:
                    current_page_menu.add_modal_item(_('Page Icon'), url=url,
                        disabled=not self.toolbar.edit_mode)
    
  • 官方文件更为详细和解释


    有一个公开的GitHub问题。

    因为我没有足够的声誉,我不能直接评论Timmy O'Mahony的帖子。但是,我想指出的是,向
    PageAdmin.inlines
    列表添加
    StackedInline
    对象的建议解决方案不再起作用


    我正在使用Djangocms3.3,在Timmy O'Mahony的版本any mine之间,作者更改了内联列表的语义。它的内容现在显示在该特定页面的权限菜单中(包括可能添加的进一步的
    StackedInline
    tablerinline
    项)。

    是否要在管理中显示这些字段,以及这些字段是否已存在于模型中?还是要向现有模型添加新字段?@kender-新字段。。我仍然需要帮助:)您可以将这些字段添加到CMS的模型中,不是吗?然后创建一个schemamigration(比如Django cms使用South)。那么剩下的就是修改/monkeypatch更改模型的ModelAdmin类……请注意,正如我在博客文章中所评论的,如果您通过页面对象本身访问数据,则不需要上下文处理器。也许Timmy的方法更清楚,因为你不需要在模板中写整个“request.current_page.extended_fields.all…”内容,但对我来说,如果我不需要在所有页面上都使用它,我想跳过它。一般来说,这是一个编码风格的问题。他们现在使用
    request.current\u page.publisher\u draft.extended\u fields.page\u image
    in>2.4。我认为这对像我这样的谷歌用户很有帮助。@hbrlovehaku life saver!由于某些原因,我无法在管理界面中显示
    ExtendedPageAdmin
    。非常漂亮的解决方案。塔克斯!非常好的解决方案,尽管当我在CMS中发布我的页面时,这会创建一个新页面,而不会将新属性复制到已发布的页面。
    PageAdmin.fieldset
    对我来说不适用。这肯定是一种更新、更简单、更好的方式-我不知何故错过了这个添加。非常感谢。