Добавить функциональность в Django FlatPages без изменения оригинального приложения Django - PullRequest
14 голосов
/ 20 июня 2009

Я хотел бы добавить поле в модель базы данных 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?

Заранее спасибо

Ответы [ 2 ]

21 голосов
/ 21 июня 2009

Ваш подход в порядке - вы просто не видите результат, потому что старая модель плоской страницы зарегистрирована в администраторе, а новая - нет. Вот что вы можете сделать в 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 регистрируется вместо нее.

7 голосов
/ 20 июня 2009

А метод в вашем посте не работает, потому что ...?

Если по какой-то причине вам действительно нужно поиграться со встроенным классом 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)

Поместите это, скажем, в «signal.py» в тот же каталог, что и ваш settings.py, и добавьте «сигналы» в top (это важно, чтобы убедиться, что обработчик сигналов получает установлен вовремя) из списка INSTALLED_APPS.

Однако это поле не будет отображаться в Admin, потому что есть специальный класс ModelAdmin для FlatPages, который явно перечисляет поля. Поэтому после того, как он будет зарегистрирован в приложении flatpages, вам нужно будет отменить его регистрацию где-нибудь (admin.site.unregister) и зарегистрировать собственный ModelAdmin.

...