2010-05-26 3 views
0

Я хочу использовать фильтр администратора django на странице списка. модели у меня есть что-то вроде этого:django admin filter tweaking

class Location(model): 
    name = CharField() 

class Inquiry(Model): 
    name = CharFiled() 
    location = ManyToManyField(Location) 

Теперь я хочу, чтобы фильтровать запросы, чтобы отобразить только те, которые содержат отношение к конкретному объекту Location. Если я использую

class InqAdmin(ModelAdmin): 
    list_filter = ['location', ] 

admin.site.register(Inquiry, InqAdmin) 

страница админ показывает мне список всех Locations и позволяет фильтровать.

Что бы я хотел получить, это получить список только тех мест, где у них есть Inquiries по отношению к ним (так что я никогда не получаю пустой результат списка после фильтрации).

Как это можно сделать?

ответ

1

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

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

The managers section in the Django docs неплохое и должно быть все, что вам нужно для его настройки.

EDIT:

sienf приносит хороший момент. Другой способ сделать это - определить подкласс django.contrib.admin.SimpleListFilter и написать метод queryset для фильтрации запросов с пустыми местоположениями. См. https://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.list_filter

+0

Это раздел, в котором говорится, что вы никогда не отфильтровываете результаты в менеджерах по умолчанию: https://docs.djangoproject.com/en/dev/topics/db/managers/#do-not- filter-away-any-results-in-this-type-of-manager-subclass. Для этого страницы администратора используют их, поэтому вы получаете всевозможные странные ошибки, так как формы добавления/редактирования не знают о других объектов (в этом случае местоположения). – bdeniker

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