2009-06-20 8 views
14

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.Agregue funcionalidad a Django FlatPages sin cambiar la aplicación Django original

Lo que quiero hacer es añadir el siguiente campo para el 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 llego a añadir esto a la modelo FlatPage?

Gracias de antemano

Respuesta

20

Su enfoque está bien; simplemente no ve el resultado porque el modelo anterior de flatpage está registrado en el administrador y el nuevo no. Esto es lo que podría hacer en admin.py de su nueva aplicación (usando nombres menos ambiguo que lo que tienes 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 hacer aquí, pero lo más importante es el modelo FlatPage no registrado y el modelo ExtendedFlatPage se está registrando en su lugar.

+0

¡Muchas gracias! Supongo que esto es lo que estaba buscando. –

+8

Tenga en cuenta que este enfoque no funcionará con el FlatpageFallbackMiddleware predeterminado: devolverá instancias del modelo original de Flatpage, no su extensión. Por lo tanto, tendrá que escribir su propia versión o usar su propia URL/vista. Además, ahora tiene dos tablas donde realmente solo se necesita una, lo que da como resultado consultas menos eficientes.En general, recomendaría escribir su propia aplicación de página plana desde cero, o usar el enfoque class_prepared para hacer un parche en el campo, en lugar de usar la herencia. –

7

Y el método en su entrada no funciona porque ...?

Si por alguna razón usted realmente necesita para jugar con la clase FlatPage orden interna y editar de forma dinámica, se puede conectar a la señal class_prepared:

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

Editar

Aquí cómo lo harías con una clase_preparado:

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 en, por ejemplo, 'signals.py' en el mismo directorio que su settings.py, y agregue 'señales' al top (esto es importante, para asegurarse de que el manejador de señales se instale a tiempo) de la lista INSTALLED_APPS.

Sin embargo, esto todavía no mostrará el campo mostrado en Admin, porque hay una clase ModelAdmin personalizada para FlatPages que enumera explícitamente los campos. Por lo tanto, después de que se registre en la aplicación de páginas planas, deberá anular el registro en alguna parte (admin.site.unregister) y registrar un ModelAdmin propio.

+0

¿El campo no aparece en el administrador? No entiendo por qué. Ese es el problema –

+0

Bueno, no hay razón para que se muestre en el administrador de la clase Django incorporada, ¡no lo has modificado! Si crea su propia FlatPage, en una aplicación separada, debe registrar su nueva clase con el administrador. Si no quiere hacer eso, puede seguir el camino de la clase preparada, pero esto supone un conocimiento bastante bueno de Python. – oggy

+0

Hmm vale, pensé que sería capaz de poner en parche la clase original de FlatPage para que realmente apareciera en el administrador sin crear una nueva aplicación (y modelos). ¿Puedes dar un ejemplo de la forma de clase preparada? –

Cuestiones relacionadas