我想一些额外的字段添加到在Django-CMS页面(在Django管理面板)。 以最简单的方式是如何做到这一点?
Answer 1:
创建一个新的应用程序(称为extended_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)
这将您的扩展模型添加为内嵌到您创建的任何页面。 访问扩展模型setttings最简单的方法,就是创建一个上下文处理器:
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网页内嵌的额外设置一个单独的模型。 我得到这个从博客帖子之前,所以如果我能找到我会后它。
编辑
以下是博客文章: http://ilian.ini.org/extending-django-cms-page-model/
Answer 2:
还有一个办法做到这一点不使用内联,和页表格上的任何地方具有领域。 例如,我有“配色方案”,我想成为下的“基本设置”字段集的自定义设置。 这可以通过重写的ModelForm和的ModelAdmin的字段集来完成。 此外,我选择了一个OneToOne场,而不是一个ForeignKey,为了简单起见。
models.py
:
from django.db import models
from cms.models.pagemodel import Page
from django.conf import settings
class PageCustomSettings(models.Model):
page = models.OneToOneField(Page, editable=False,
related_name='custom_settings')
color_scheme = models.CharField(blank=True, choices=settings.COLOR_SCHEMES,
max_length=20)
admin.py
:
from django import forms
from django.conf import settings
from django.contrib import admin
from cms.admin.pageadmin import PageAdmin, PageForm
from cms.models.pagemodel import Page
from web.models import PageCustomSettings
color_scheme_choices = (('', '---------'),) + settings.COLOR_SCHEMES
class CustomPageForm(PageForm):
color_scheme = forms.ChoiceField(choices=color_scheme_choices,
required=False)
def __init__(self, *args, **kwargs):
# make sure that when we're changing a current instance, to set the
# initial values for our custom fields
obj = kwargs.get('instance')
if obj:
try:
opts = obj.custom_settings
kwargs['initial'] = {
'color_scheme': opts.color_scheme
}
except PageCustomSettings.DoesNotExist:
pass
super(CustomPageForm, self).__init__(*args, **kwargs)
def save(self, commit=True):
# set the custom field values when saving the form
obj = super(CustomPageForm, self).save(commit)
try:
opts = PageCustomSettings.objects.get(page=obj)
except PageCustomSettings.DoesNotExist:
opts = PageCustomSettings(page=obj)
opts.color_scheme = self.cleaned_data['color_scheme']
opts.save()
return obj
PageAdmin.form = CustomPageForm
PageAdmin.fieldsets[1][1]['fields'] += ['color_scheme']
admin.site.unregister(Page)
admin.site.register(Page, PageAdmin)
Answer 3:
有扩展页和标题车型的官方途径,我强烈推荐这个官方文档:
- 扩展页面和标题车型从docs.django-cms.org
我也强烈建议使用一个占位符,如果你可以的,因为写这个答案,我现在更喜欢创造的封面图片的使用情况下的占位符。 (你甚至可以,如果获得模板中只是图片的URL ,你愿意的话)。
链接的总结:
创建的子类
PageExtension
在你的models.py
文件并注册它:class IconExtension(PageExtension): image = models.ImageField(upload_to='icons') extension_pool.register(IconExtension)
还创建的子类
PageExtensionAdmin
在admin.py
文件并注册它:class IconExtensionAdmin(PageExtensionAdmin): pass admin.site.register(IconExtension, IconExtensionAdmin)
最后,为了让它从工具栏访问,创建的子类
ExtensionToolbar
在cms_toolbars.py
并注册它:@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问题增加了对添加元素的正常和先进的“页面设置”对话提供支持 。
Answer 4:
我已经通过谷歌在这里得到答案和让我在正确的轨道Django的CMS 3测试版上。 为了延长页面模型和钩您的扩展到工具栏,你可以沿着官方文档如下:
http://django-cms.readthedocs.org/en/latest/how_to/extending_page_title.html
在模板访问值
{{ request.current_page.<your_model_class_name_in_lowercase>.<field_name> }}
例如,我扩展了这个模型的页面模式:
from django.db import models
from cms.extensions import PageExtension
from cms.extensions.extension_pool import extension_pool
class ShowDefaultHeaderExtension(PageExtension):
show_header = models.BooleanField(default=True)
extension_pool.register(ShowDefaultHeaderExtension)
要访问模板的价值观:
{{ request.current_page.showdefaultheaderextension.show_header }}
Answer 5:
因为我没有足够的声誉,我不能在邓肯奥马奥尼的帖子直接评论。 不过,我想指出,加入的提出的解决方案StackedInline
对象的PageAdmin.inlines
像预想的那样列表中不工作了。
我与Djangocms 3.3工作,并某处邓肯奥马奥尼版本之间有任何矿场作者改变了语义的在线列表。 它的内容,现在在菜单的权限对应的特定网页显示(futher包括可能添加StackedInline
或TabularInline
项目)。