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

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top