Django: фильтрация или отображение метода модели в Django Admin - PullRequest
2 голосов
/ 07 декабря 2009

У меня есть модель с истечением срока действия DateField.

Я хочу установить фильтр администратора, который позволит пользователю переключаться между «Не истек» и «Любой».

Метод модели довольно прост для сравнения дат, без проблем.

Однако назначение этого поля или параметра фильтра в AdminForm не является автоматическим.

Возможна ли такая вещь, и если нет, то какой будет мудрый обходной путь ...

Я бы даже был готов к какому-то автоматическому удалению строк с истекшим сроком, но я не знаю, как начать этот путь.

1 Ответ

5 голосов
/ 08 декабря 2009

Вы можете включить модель дважды на сайте администратора, зарегистрировав для нее два класса ModelAdmin. Вы можете переопределить queryset() метод ModelAdmin, чтобы настроить отображение экземпляров. Обратите внимание, что вам нужно определить прокси модели и использовать его во втором ModelAdmin классе, в противном случае Django жалуется на то, что дважды регистрирует одну и ту же модель.

models.py

class ExampleModel(models.Model):
    expired = models.DateField()

class ExpiredExampleModelProxy(ExampleModel):
    class Meta:
        proxy = True
        verbose_name = 'Expired Example'
        verbose_name_plural = 'Expired Examples'

admin.py

class NotExpiredExampleAdmin(models.ModelAdmin):
    def queryset(self, request):
        return (super(ExampleAdmin, self).queryset(request)
                .filter(expiration__gte=date.today()))

class ExpiredExampleAdmin(models.ModelAdmin):
    def queryset(self, request):
        return (super(ExampleAdmin, self).queryset(request)
                .filter(expiration__lt=date.today()))

admin.site.register(ExampleModel, NotExpiredExampleAdmin)
admin.site.register(ExpiredExampleModelProxy, ExpiredExampleAdmin)

Вместо настройки ModelAdmin.queryset вы также можете определить пользовательские менеджеры для моделей, чтобы получить такую ​​же фильтрацию и вне администратора.

Смотри также

...