如何在django cms中向页面添加一些额外字段?(在django管理面板中)
我想在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
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
对我来说不适用。这肯定是一种更新、更简单、更好的方式-我不知何故错过了这个添加。非常感谢。