django-cms(django管理パネル)のページにいくつかのフィールドを追加したいと思います。これを最も簡単な方法で行うにはどうすればよいですか?
5 に答える
新しいアプリ(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)
これにより、作成したページにインラインとして拡張モデルが追加されます。拡張モデル設定にアクセスする最も簡単な方法は、コンテキストプロセッサを作成することです。
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/
インラインを使用せずに、ページフォームの任意の場所にフィールドを配置することなくこれを行う方法もあります。たとえば、「基本設定」フィールドセットの下に置きたい「配色」のカスタム設定があります。これは、ModelFormとModelAdminのフィールドセットをオーバーライドすることで実行できます。また、わかりやすくするために、ForeignKeyではなくOneToOneフィールドを選択しました。
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)
ページとタイトルのモデルを拡張する公式の方法があります。この公式ドキュメントを強くお勧めします。
- 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)
最後に、ツールバーからアクセスできるようにするには、inのサブクラスを作成し
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の問題があります。
私はグーグル経由でここに来ました、そして答えは私をDjangoCMS3ベータのための正しい軌道に乗せました。ページモデルを拡張し、拡張機能をツールバーにフックするには、公式ドキュメントに従ってください。
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 }}
私は十分な評判を持っていないので、TimmyO'Mahonyの投稿に直接コメントすることはできません。StackedInline
ただし、オブジェクトをPageAdmin.inlines
リストに追加するという提案されたソリューションは、想定どおりに機能しなくなったことに注意してください。
私はDjangocms3.3を使用しており、Timmy O'Mahonyのバージョンの間のどこかで、作成者がインラインリストのセマンティクスを変更しました。そのコンテンツは、その特定のページの[アクセス許可]メニューに表示されるようになりました(追加された可能性のあるアイテムStackedInline
やTabularInline
アイテムを含む)。