2009-06-20 8 views
14

Ich möchte dem Django FlatPage Datenbankmodell ein Feld hinzufügen, aber ich weiß nicht, wie ich das erweitern kann, ohne die ursprüngliche Anwendung zu bearbeiten.Funktionalität zu Django FlatPages hinzufügen, ohne die ursprüngliche Django App zu ändern

Was ich tun möchte, ist das folgende Feld zum Modell hinzuzufügen:


from django.db import models 
from django.contrib.flatpages.models import FlatPage as FlatPageOld 

class FlatPage(FlatPageOld): 
    order = models.PositiveIntegerField(unique=True) 

Wie kann ich dies das Flat Modell hinzuzufügen bekommen?

Vielen Dank im Voraus

Antwort

20

Ihr Ansatz ist in Ordnung - Sie sehen das Ergebnis einfach nicht, weil das alte FlatPage-Modell im Admin registriert ist und das neue nicht. Hier ist, was Sie in Ihrem neuen App admin.py tun könnte (mit weniger zweideutig Benennung als das, was du hast oben vor):

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) 

Offensichtlich gibt es ein paar Dinge hier los ist, aber am wichtigsten ist das Flat Modell ist Nicht registriert sein und das ExtendedFlatPage-Modell wird an seiner Stelle registriert.

+0

Vielen Dank! Ich denke, das ist, was ich gesucht habe. –

+8

Beachten Sie, dass dieser Ansatz nicht mit der FlatpageFallbackMiddleware-Standardfunktion funktioniert - er gibt Instanzen des ursprünglichen Flatpage-Modells zurück, nicht Ihre Erweiterung. Sie müssen also Ihre eigene Version davon schreiben oder Ihre eigene URL/Ansicht verwenden. Außerdem haben Sie jetzt zwei Tabellen, in denen wirklich nur eine benötigt wird, was zu weniger effizienten Abfragen führt.Alles in allem würde ich empfehlen, Ihre eigene Flatseite-App von Grund auf neu zu schreiben, oder den class_prepared-Ansatz zu verwenden, um das Feld in moneypatch zu setzen, anstatt Vererbung zu verwenden. –

7

Und die Methode in Ihrem Beitrag, weil nicht funktioniert ...?

Wenn aus irgendeinem Grund Sie wirklich mit dem eingebauten Flat Klasse zu Geige brauchen und es dynamisch bearbeiten, können Sie das class_prepared Signal Haken:

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

bearbeiten

Hier wie Sie es mit einem class_prepared tun würden:

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) 

Setzen Sie diese, sagen wir, 'signals.py' in das gleiche Verzeichnis wie Ihre settings.py, und fügen Sie 'Signale' zu top hinzu (dies ist wichtig, um sicherzustellen, dass der Signal-Handler rechtzeitig installiert wird) die INSTALLED_APPS-Liste.

Das Feld wird jedoch immer noch nicht in Admin angezeigt, da es eine benutzerdefinierte ModelAdmin-Klasse für FlatPages gibt, die die Felder explizit auflistet. Nachdem es in der App flatpages registriert wurde, müssen Sie es irgendwo aufheben (admin.site.unregister) und ein ModelAdmin registrieren.

+0

Das Feld erscheint nicht im Admin? Ich verstehe nicht warum. Das ist das Problem –

+0

Nun, es gibt keinen Grund, es sollte im Admin für die eingebaute Django-Klasse zeigen - Sie haben es nicht geändert! Wenn Sie Ihre eigene FlatPage in einer separaten App erstellen, müssen Sie Ihre neue Klasse beim Admin registrieren. Wenn Sie das nicht tun möchten, können Sie den class_prepared Weg gehen, aber das setzt ziemlich gute Kenntnisse von Python voraus. – oggy

+0

Hmm ok, ich dachte, ich könnte die ursprüngliche FlatPage-Klasse monkeypatch, so dass es tatsächlich im Admin erscheinen würde, ohne eine neue App (und Modelle) zu erstellen. Kannst du ein Beispiel für den class_prepared Weg geben? –

Verwandte Themen