Django 管理员 models.Manager

Django Admin models.Manager

我有一个博客的条目 class,它有两个字段,实时和草稿,引用了一个习惯 models.Manager。这在我的应用程序中效果很好;但是管理员以某种方式引用了我的 LiveEntryManager。

以下是两位经理:

class LiveEntryManager(models.Manager):
def get_query_set(self):
    return super(LiveEntryManager, self).get_queryset().filter(status=self.model.LIVE_STATUS)

class DraftEntryManager(models.Manager):
    def get_query_set(self):
        return super(DraftEntryManager, self).get_queryset().filter(status=self.model.DRAFT_STATUS)

这是我的 class:

class Entry(models.Model):
LIVE_STATUS = 1
DRAFT_STATUS = 2
HIDDEN_STATUS = 3
STATUS_CHOICES = (
    (LIVE_STATUS, 'Live'),
    (DRAFT_STATUS, 'Draft'),
    (HIDDEN_STATUS, 'Hidden'),
)
title = models.CharField(max_length=250)
excerpt = models.TextField(blank=True, help_text='Excerpt Text')
body = models.TextField(help_text='Body Text')
pub_date = models.DateField()
slug = models.SlugField(unique_for_date='pub_date')
pub_date = models.DateTimeField(default=datetime.datetime.now)
author = models.ForeignKey(User)
enable_comments = models.BooleanField(default=True)
status = models.IntegerField(choices=STATUS_CHOICES, default="LIVE_STATUS")
categories = models.ManyToManyField(Category)
excerpt_html = models.TextField(editable=False, blank=True)
body_html = models.TextField(editable=False, blank=True)
live = LiveEntryManager()
draft = DraftEntryManager()
objects = models.Manager()

class Meta:
    verbose_name_plural = "Entries"
    ordering = ['-pub_date']

def __unicode__(self):
    return self.title

我在下面的网址中使用了它:

url(r'^$',
    ArchiveIndexView.as_view(queryset=Entry.live.all(),
                             date_field='pub_date'),
                             name='coltrane_entry_archive_index'),
url(r'^draft/$',
    ArchiveIndexView.as_view(queryset=Entry.draft.all(),
                             date_field='pub_date'),
                             name='coltrane_entry_archive_index'),

我的问题是管理页面 returns 仅基于 LiveEntryManager 结果。一旦我将它们从实时更改为草稿,它们就会从条目管理显示中删除。我不确定管理员如何使用该管理器来过滤结果。

我在管理页面中的逻辑非常简单:

from models import Entry

class EntryAdmin(admin.ModelAdmin):
    prepopulated_fields = {'slug': ['title']}

admin.site.register(Entry, EntryAdmin)

两个网址似乎同名。也许这是你的问题?

在您的 Entry 模型中向上移动 objects = models.Manager(),使其成为 第一个 经理。模型中的第一个经理是 默认 经理 (doc) and that's what the Admin is using (code)。