Agregue funcionalidad a Django FlatPages sin cambiar la aplicación Django original
-
06-07-2019 - |
Pregunta
Me gustaría agregar un campo al modelo de base de datos Django FlatPage, pero realmente no sé cómo extender esto sin editar la aplicación original.
Lo que quiero hacer es agregar el siguiente campo al modelo:
from django.db import models
from django.contrib.flatpages.models import FlatPage as FlatPageOld
class FlatPage(FlatPageOld):
order = models.PositiveIntegerField(unique=True)
¿Cómo puedo agregar esto al modelo FlatPage?
Gracias de antemano
Solución
Su enfoque está bien: simplemente no ve el resultado porque el antiguo modelo de página plana está registrado en el administrador y el nuevo no. Esto es lo que puede hacer en admin.py de su nueva aplicación (usando nombres menos ambiguos que los que tiene arriba):
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)
Obviamente, hay algunas cosas que suceden aquí, pero lo más importante es que el modelo FlatPage no está registrado y el modelo ExtendedFlatPage está siendo registrado en su lugar.
Otros consejos
¿Y el método en tu publicación no funciona porque ...?
Si por alguna razón realmente necesita jugar con la clase incorporada FlatPage y editarla dinámicamente, puede conectarla a la señal class_prepared:
http://docs.djangoproject.com/en/dev / ref / señales / # preparado para la clase
Editar
Así es como lo haría con un 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)
Ponga esto, digamos, 'señales.py' en el mismo directorio que su settings.py, y agregue 'señales' al top (esto es importante, para asegurarse de que el controlador de señal se instala a tiempo) de la lista INSTALLED_APPS.
Sin embargo, esto todavía no mostrará el campo en Admin, porque hay una clase ModelAdmin personalizada para FlatPages que enumera explícitamente los campos. Entonces, después de que se registre en la aplicación flatpages, deberá anular el registro en alguna parte (admin.site.unregister) y registrar un ModelAdmin propio.