Существует photologue приложение, простая фотогалерея для django, реализовывая объекты Галереи и фотография. Объект галереи имеет поле ManyToMany, которому возражает ссылочная фотография.
Я должен смочь получить список всех фотографий для данной Галереи. Действительно ли возможно добавить фильтр Галереи к администраторской странице фотографии? Если возможно, как приложить все усилия?
Вам нужно написать собственный FilterSpec! Пользовательский фильтр в Django Admin на Django 1.3 или ниже
Это будет выглядеть так:
from django.contrib.admin.filterspecs import RelatedFilterSpec, FilterSpec
from models import Gallery
class GalleryFilterSpec(RelatedFilterSpec):
def __init__(self, f, request, params, model, model_admin):
self.lookup_kwarg = f.name
self._lookup_model = f.rel.to
self.lookup_val = request.GET.get(self.lookup_kwarg, None)
self.user = request.user
self.lookup_choices = [(g.pk, g.name) for g in Gallery.objects.all()]
def has_output(self):
return len(self.lookup_choices) > 1
def title(self):
return self._lookup_model._meta.verbose_name
FilterSpec.filter_specs.insert(0,
(lambda f: f.rel.to == Gallery, GalleryFilterSpec))
Поместите его в модуль filters.py
в свой пакет приложения и импортируйте его в себя admin.py
(важно импортировать его, чтобы фильтр был зарегистрирован на сайте администратора!)
РЕДАКТИРОВАТЬ: «f» - это экземпляр поля, в данном случае models.ManyToManyField
Последняя строка регистрирует FilterSpec для всех полей, которые имеют отношение к модели галереи. Это не будет работать, как вы упомянули, если поле определено в модели галереи, поскольку django.contrib.admin.views.main.ChangeList.get_filters
проверяет, действительно ли поле, которое вы определяете в списке, существует в модель (не работает и для related_name). Я думаю, что самый простой способ - вы можете создать собственный шаблон для этого списка изменений и жестко закодировать там свой фильтр, сам FilterSpec не нужен для самой фильтрации, django использует для этого только параметры получения URL!
Ну вот как я это сделал.
Я сделал собственный шаблон администратора "change_list.html". Пользовательский тег шаблона создает список всех существующих галерей. Фильтрация производится следующим образом:
class PhotoAdmin(admin.ModelAdmin):
...
def queryset(self, request):
if request.COOKIES.has_key("gallery"):
gallery = Gallery.objects.filter(title_slug=request.COOKIES["gallery"])
if len(gallery)>0:
return gallery[0].photos.all()
return super(PhotoAdmin, self).queryset(request)
Cookie устанавливается с помощью javascript.