Frage

Ich möchte ein Feld an die Django Flat Datenbank-Modell hinzufügen, aber ich weiß nicht wirklich, wie dies zu erweitern, ohne die ursprüngliche Anwendung zu bearbeiten.

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

War es hilfreich?

Lösung

Ihr Ansatz ist in Ordnung - man muss nur sehen das Ergebnis nicht, weil das alte Modell Flat im Admin angemeldet und die neue ist nicht. Hier ist, was Sie in Ihrem neuen App admin.py tun könnten (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)

Natürlich gibt es ein paar Dinge hier los ist, aber am wichtigsten ist das Flat Modell wird nicht registrierten und das ExtendedFlatPage Modell an seiner Stelle eingetragen wird.

Andere Tipps

Und die Methode in Ihrem Beitrag nicht, da nicht ...?

Wenn Sie aus irgendeinem Grund wirklich müssen mit der eingebauten Flat Klasse Geige und dynamisch bearbeiten, können Sie das class_prepared Signal Haken:

http://docs.djangoproject.com/en/dev / ref / Signale / # Klasse vorbereitet

Bearbeiten

Hier ist, wie Sie es mit einem class_prepared tun würde:

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 dieses in, sagen wir, ‚signals.py‘ im gleichen Verzeichnis wie die settings.py, und fügen Sie ‚Signale‘ an die oben (das ist wichtig, um sicherzustellen, dass das Signal-Handler wird in der Zeit) der INSTALLED_APPS Liste installiert.

Dies wird jedoch noch nicht das Feld in Admin angezeigt bekommen, weil es eine benutzerdefinierte Modeladmin-Klasse für Flatpages ist, die explizit die Felder auflistet. So, nachdem es in der Flatpages App registriert wird, müssen Sie es irgendwo deregistrieren (admin.site.unregister) und einen Modeladmin der eigenen registrieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top