Добавьте функциональность в Django FlatPages без изменения исходного приложения Django.
-
06-07-2019 - |
Вопрос
Я хотел бы добавить поле в модель базы данных 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?
заранее спасибо
Решение
Ваш подход хорош - вы просто не видите результат, потому что старая модель плоской страницы зарегистрирована в администраторе, а новая - нет. Вот что вы можете сделать в 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 регистрируется вместо нее.
Другие советы
И метод в вашем посте не работает, потому что...?
Если по какой-то причине вы Действительно Если вам нужно повозиться со встроенным классом 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.
Однако это все равно не отобразит поле в Admin, поскольку для FlatPages существует специальный класс ModelAdmin, в котором поля явно перечислены.Поэтому после того, как он будет зарегистрирован в приложении Flatpages, вам нужно будет отменить его регистрацию где-нибудь (admin.site.unregister) и зарегистрировать собственного администратора модели.