Фильтрация результатов модели для окна выбора администратора Django - PullRequest
5 голосов
/ 15 июня 2010

Я только начал играть с Джанго сегодня и до сих пор считаю, что делать простые вещи довольно сложно. Сейчас я борюсь с тем, чтобы отфильтровать список типов состояний. Модель StatusTypes:

class StatusTypes(models.Model):
    status = models.CharField(max_length=50)
    type = models.IntegerField()
    def __unicode__(self):
        return self.status
    class Meta:
        db_table = u'status_types'

На одной странице администратора мне нужны все результаты, где type = 0, а на другой мне нужны все результаты, где type = 1, поэтому я не могу просто ограничить их внутри модели. Как бы я поступил так?

РЕДАКТИРОВАТЬ: Я должен был быть немного более ясным. У меня есть модель "Unit", которая имеет внешний ключ для StatusTypes. Модели следующие:

class StatusTypes(models.Model):
    status = models.CharField(max_length=50)
    type = models.IntegerField()
    def __unicode__(self):
        return self.status
    class Meta:
        db_table = u'status_types'

class Unit(models.Model):
    name = models.CharField(unique=True, max_length=50)
    status = models.ForeignKey(StatusTypes, db_column='status')
    note = models.TextField()
    date_added = models.DateTimeField()
    def __unicode__(self):
        return self.name
    class Meta:
        db_table = u'units'

Так что теперь на странице администратора для модели объекта я хочу ограничить статус только теми, у кого тип = 1. Исходя из приведенного ниже отклика на лазерную науку, я попробовал следующий код:

from inv.inventory.models import Unit
from django.contrib import admin

class UnitAdmin(admin.ModelAdmin):
    def queryset(self, request):
        qs = super(UnitAdmin, self).queryset(request)
        return qs.filter(type=0)

admin.site.register(Unit, UnitAdmin)

Но это не изменило поле выбора вообще. Я также попытался напечатать значение qs, и на мой терминал ничего не выводилось, поэтому мне интересно, должен ли я как-то вызывать queryset?

РЕДАКТИРОВАТЬ 2: Возможно, не было ясно, что я хочу отфильтровать это для раскрывающегося списка состояния, который находится на странице создания для модели модуля.

Ответы [ 2 ]

4 голосов
/ 15 июня 2010

РЕДАКТИРОВАТЬ:

Оказывается, что ModelAdmin.formfield_for_foreignkey был правильный ответ в этой ситуации: http://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.formfield_for_foreignkey

ПРЕДЫДУЩИЙ ОТВЕТ:

Посмотрите на атрибут list_filter для ModelAdmin .Это больше похоже на то, что вы хотите для меня, поскольку оно создаст приятный интерфейс для фильтрации по различным критериям, а не произвольно ограничивает ваш набор запросов.

2 голосов
/ 15 июня 2010

Вы можете переопределить метод queryset вашего MyModelAdmin класса:

from django.contrib import admin

class MyModelAdmin(admin.ModelAdmin):

    def queryset(self, request):
        qs = super(MyModelAdmin, self).queryset(request)
        return qs.filter(type=0)

admin.site.register(StatusTypes, MyModelAdmin)

Этот администратор будет отображать только те объекты вашей модели, которые имеют type=0!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...