Администратор Django, объекты фильтра ссылкой ManyToMany

Существует photologue приложение, простая фотогалерея для django, реализовывая объекты Галереи и фотография. Объект галереи имеет поле ManyToMany, которому возражает ссылочная фотография.

Я должен смочь получить список всех фотографий для данной Галереи. Действительно ли возможно добавить фильтр Галереи к администраторской странице фотографии? Если возможно, как приложить все усилия?

1
задан Ignacio Vazquez-Abrams 14 June 2010 в 11:11
поделиться

2 ответа

Вам нужно написать собственный 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!

2
ответ дан 2 September 2019 в 23:46
поделиться

Ну вот как я это сделал.

Я сделал собственный шаблон администратора "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.

0
ответ дан 2 September 2019 в 23:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: