2017-01-17 3 views
0

Ich habe 'Seiten' Abschnitt in meiner Admin-Seite. Hier ist ein Teil meines models.py:Django - zwei Sektionen aus dem gleichen Modell

class Site(models.Model): 
    category = models.ForeignKey('Category') 
     subcategory = ChainedForeignKey(
     'Subcategory', 
     chained_field='category', 
     chained_model_field='category', 
     show_all=False, 
     auto_choose=True) 
    name = models.CharField(max_length=70) 
    description = models.TextField() 
    keywords = MyTextField() 
    date = models.DateTimeField(default=datetime.now, editable=False) 
    url = models.URLField() 
    is_active = models.BooleanField(default=False) 

Ich mag würde eine andere Seite Abschnitt in meinem Admin hinzufügen, die nur inaktive Websites zeigen (is_active = False). Ist es möglich? (Ich meine:

Sites - first section (list of all sites) 
Inactive sites (number of inactive sites) - second section (only inactive sites) 

)

Hier mein Admin-Klasse ist:

class SiteAdmin(admin.ModelAdmin): 
    list_display = ('is_active', 'name', 'description', 'keywords', 'date') 
    fields = ('name', 'url', 'category', 'subcategory', 'description', 
       'keywords', 'date', 'is_active') 
    readonly_fields = ('date',) 
    list_editable = ('is_active',) 
    list_display_links = ('name',) 

Antwort

1

Sie können dies erreichen, indem eine Admin-Seite für eine proxy model Registrierung und das Überschreiben der get_queryset method of the registered ModelAdmin.

Sie können ein Objekt nur einmal auf der Verwaltungsseite registrieren. Das Proxy-Modell fungiert somit als neues Modell, das separat registriert werden muss. Da es sich nur um ein Proxy-Modell handelt, wirkt sich seine Anwesenheit nur auf Python-Code aus und erstellt kein neues Modell in der Datenbank.

Der Befehl get_queryset ist, wie ModelAdmin die Modellinstanzen zur Anzeige bringt. Durch Überschreiben können wir also die gewünschten Filter hinzufügen.

In Ihrem Fall würden Sie so etwas zur Datei admin.py in Ihrer App hinzufügen.

class InactiveSite(Site): 
    class Meta: 
     proxy = True 
     verbose_name_plural = 'Inactive sites' 

class InactiveSiteAdmin(admin.ModelAdmin): 
    def get_queryset(self, request): 
     return self.model.objects.filter(is_active=False) 

admin.site.register(InactiveSite, InactiveSiteAdmin) 
Verwandte Themen