18

Django FlatPage データベース モデルにフィールドを追加したいのですが、元のアプリケーションを編集せずにこれを拡張する方法がよくわかりません。

私がやりたいことは、次のフィールドをモデルに追加することです:


from django.db import models
from django.contrib.flatpages.models import FlatPage as FlatPageOld

class FlatPage(FlatPageOld):
    order = models.PositiveIntegerField(unique=True)

これを FlatPage モデルに追加するにはどうすればよいですか?

前もって感謝します

4

3 に答える 3

25

あなたのアプローチは問題ありません-古いフラットページモデルが管理者に登録され、新しいモデルが登録されていないため、結果が表示されません。新しいアプリの admin.py でできることは次のとおりです (上記よりもあいまいでない名前を使用します)。

from django.contrib import admin
from django.contrib.flatpages.admin import FlatPageAdmin
from django.contrib.flatpages.forms import FlatpageForm
from django.contrib.flatpages.models import FlatPage

from models import ExtendedFlatPage

class ExtendedFlatPageForm(FlatpageForm):
    class Meta:
        model = ExtendedFlatPage

class ExtendedFlatPageAdmin(FlatPageAdmin):
    form = ExtendedFlatPageForm
    fieldsets = (
        (None, {'fields': ('url', 'title', 'content', 'sites', 'order')}),
    )     

admin.site.unregister(FlatPage)
admin.site.register(ExtendedFlatPage, ExtendedFlatPageAdmin)

明らかに、ここでいくつかのことが行われていますが、最も重要なのは、FlatPage モデルが登録解除され、代わりに ExtendedFlatPage モデルが登録されていることです。

于 2009-06-21T13:32:33.827 に答える
7

そして、あなたの投稿の方法は機能しません...?

なんらかの理由で組み込みのFlatPageクラスをいじって動的に編集する必要がある場合は、class_prepared シグナルにフックできます。

http://docs.djangoproject.com/en/dev/ref/signals/#class-prepared

編集

class_prepared でそれを行う方法は次のとおりです。

from django.db.models.signals import class_prepared
from django.db import models

def alter_flatpages(sender, **kwargs):
    if sender.__module__ == 'django.contrib.flatpages.models' and sender.__name__ == 'FlatPage':
        order = models.IntegerField()
        order.contribute_to_class(sender, 'order')

class_prepared.connect(alter_flatpages)

これを、たとえば、'signals.py' を settings.py と同じディレクトリに置き、'signals' をINSTALLED_APPS リストの一番上に追加します(これは、シグナル ハンドラーが時間内にインストールされるようにするために重要です)。

ただし、フィールドを明示的にリストする FlatPages 用のカスタム ModelAdmin クラスがあるため、これでも Admin にフィールドが表示されません。そのため、flatpages アプリに登録された後、どこかで登録を解除し (admin.site.unregister)、独自の ModelAdmin を登録する必要があります。

于 2009-06-20T13:02:07.927 に答える
0
  1. アプリsettings.py の移行フォルダーの場所をデフォルト以外のフォルダーに変更します。django.contrib.flatpages例えば:

settings.py:

MIGRATION_MODULES = {'flatpages': 'yourproject.flatpages.migrations'}

__init__.pyフォルダー内に空のファイルyourprojectflatpages作成し、それらの辞書をパッケージとして扱う必要があることに注意してmigrationsくださいPython

  1. 管理コマンドを実行してmakemigrations、最初の移行をMIGRATION_MODULESフォルダーに入力します。デフォルトのものと同じように見えるはずです。

  2. apps.pyアプリの 1 つ (できれば flatpages 機能を使用するアプリ)内に、oggy のclass_preparedソリューションを追加します。

apps.py:

from django.apps import AppConfig
from django.db.models.signals import class_prepared
from django.db import models


def alter_flatpages(sender, **kwargs):
    if sender.__module__ == 'django.contrib.flatpages.models' and sender.__name__ == 'FlatPage':
        meta_description = models.CharField(max_length=255, blank=True, null=True)
        meta_description.contribute_to_class(sender, 'meta_description')


class TexteConfig(AppConfig):
    name = 'marlene.texte'

    def __init__(self, app_name, app_module):
        super().__init__(app_name, app_module)
        class_prepared.connect(alter_flatpages)
  1. 再度実行して、別のマイグレーションを追加してくださいmakemigrations。今回はCharField meta_descriptionをモデルに追加しました。migrate変更をデータベースに適用します。

  2. 次を変更しFlatPageAdminます。

admin.py:

from django.contrib.flatpages.admin import FlatPageAdmin
from django.contrib.flatpages.models import FlatPage

class MarleneFlatPageAdmin(FlatPageAdmin):
    fieldsets = (
        (None, {'fields': ('url', 'title', 'content', 'meta_description', 'sites')}),
        (_('Advanced options'), {
            'classes': ('collapse',),
            'fields': ('registration_required', 'template_name'),
        }),
    )


admin.site.unregister(FlatPage)
admin.site.register(FlatPage, MarleneFlatPageAdmin)

このソリューションの最大の欠点はDjango、将来フラットページ アプリに新しい移行を追加する場合、それらを管理する責任があることです。現在の状況に適していると思われる場合でも、フラットページアプリを使用しないことをお勧めします.

于 2020-05-11T06:04:42.127 に答える