2013-05-03 4 views
4

Я только начал разыгрывать Django admin views, и для начала я пытаюсь сделать что-то очень простое: показывая несколько полей в списке объектов, используя list_display, как описано здесь: https://docs.djangoproject.com/en/dev/ref/contrib/admin/Django admin list_display не показывает несколько объектов

Это мой мертвый простой код:

class ArticleAdmin(admin.ModelAdmin): 
    list_display = ('title', 'category') 

к сожалению, опция list_display вызывает столбчатый вид появляться, но только некоторые из объектов (40 из 85) в настоящее время отображения в списке , Я не могу понять, почему некоторые объекты проявляются над другими - их поля выглядят так, как будто они заполняются аналогичным образом. Это явно не разбиение на страницы, потому что, когда я попробовал его у администратора другой модели, он показал только 2 объекта из примерно 70 объектов.

Что может быть здесь?

[UPDATE] Статья Модель:

class Article(models.Model): 
    revision = models.ForeignKey('ArticleRevision', related_name="current_revision") 
    category = models.ForeignKey('meta.Category') 
    language = models.ForeignKey('meta.Language', default=get_default_language) 
    created = models.DateTimeField(auto_now_add=True, editable=False) 
    changed = models.DateTimeField(auto_now=True, editable=False) 
    title = models.CharField(max_length=256) 
    resources = models.ManyToManyField('oer.Resource', blank=True) 
    image = models.ManyToManyField('media.Image', blank=True) 
    views = models.IntegerField(editable=False, default=0) 
    license = models.ForeignKey('license.License', default=get_default_license) 
    slug = models.SlugField(max_length=256) 
    difficulty = models.PositiveIntegerField(editable=True, default=0) 
    published = models.NullBooleanField() 
    citation = models.CharField(max_length=1024, blank=True, null=True) 

Перед добавлением list_display:

Django amdin before list_display

После добавления list_display:

Django amdin after list_display

[UPDATE] Такое поведение наблюдается только в том случае, если поля ForeignKey включены в кортеж list_display. Любой из них.

[UPDATE] Категория код модели:

class Category(models.Model): 
    title = models.CharField(max_length=256) 
    parent = models.ForeignKey('self') 
    project = models.NullBooleanField(default=False) 
    created = models.DateTimeField(auto_now_add=True, editable=False) 
    slug = models.SlugField(max_length=256, blank=True) 

    def __unicode__(self): 
     return self.title 
+1

показывает все объекты, если вы вообще удаляете опцию 'list_display'? – karthikr

+0

@karthikr: Да, –

+0

Можете ли вы опубликовать свои модели и скриншоты того, что он показывает? – dm03514

ответ

13

Такое поведение вызвано внешним ключ отношением где-то, что не объявлен как обнуляемые, но тем не менее, имеет нулевое значение в базе данных. Когда у вас есть отношения ManyToOne в list_display, класс списка изменений всегда будет выполнять запрос, используя select_related. (См. Метод get_query_set в django.contrib.admin.views.ChangeList).

select_related по умолчанию следует за всеми внешними ключами на каждом объекте, поэтому любой сломанный внешний ключ, найденный этим запросом, приведет к выпадению данных при оценке запроса. Это не относится к администратору; вы можете в интерактивном режиме проверить его, сравнив результаты статьи.objects.all() с Article.objects.all(). select_related().

Нет простого способа управления внешними ключами, которые администратор будет искать - select_related принимает некоторые параметры, но администратор не предоставляет способ их прохождения. Теоретически вы можете написать свой собственный класс ChangeList и переопределить get_query_set, но я не рекомендую этого.

Реальное решение заключается в том, чтобы убедиться, что поля модели внешнего ключа точно отражают состояние вашей базы данных в нулевых настройках. Лично я, вероятно, сделаю это, комментируя все FK на статью, отличную от категории, и посмотрю, помогает ли это, а затем поочередно возвращая их, пока все не начнет ломаться. Проблема не связана с FK самой статьей; если в редакции, языке или категории есть сломанный FK, который все равно приведет к сбою пропущенных строк. Или, если что-то, к чему они относятся, имеет сломанный FK и т. Д.

Смежные вопросы