2012-06-28 2 views
0

У меня есть следующая ситуация. Существует модель для проекта и одна для изображения проекта.фильтр от ForeignKey в django admin

class Project(models.Model): 
    name = models.CharField(max_length=300) 
    ... #some more fields 

class ProjectImage(models.Model): 
    image = models.ImageField(upload_to = "uploads/") 
    projekt = models.ForeignKey(Projekt) 

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

У меня уже есть значок в обзоре, который является зеленым или красным, если у него есть прикрепленное изображение или нет. Он работает с пользовательской функцией администратора модели (это может быть не самое быстрое решение, но работает нормально).

class ProjectAdmin(admin.ModelAdmin): 
    def image(self, obj): 
     img = "no" 
     images = ProjectImage.objects.only('id',).filter(project=obj) 
     if images: 
      img = "yes" 
     return "<img src='"+ADMIN_MEDIA_PREFIX+"img/admin/icon-"+img+".gif' />" 

    list_display = ('name', 'bild') 

Но AFAIK я не могу использовать подобный метод просто возвращает логическое значение и передать его в качестве пользовательского фильтра.

Я также видел это: http://twigstechtips.blogspot.ch/2010/10/django-create-custom-admin-model-filter.html Но похоже, что пользовательский фильтр должен быть прикреплен к полю модели, и у меня нет поля изображения в проектах.

У меня есть другой способ сделать это? thx

+0

возможно это поможет: https://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.list_filter – marianobianchi

ответ

2

Вы должны быть в состоянии сделать это с помощью custom list filters, начиная с Django 1.4. Вы хотите что-то вроде этого (непроверенные):

from django.contrib.admin import SimpleListFilter 

class HasImageFiter(SimpleListFilter): 
    title = 'has image' 
    parameter_name = 'has_image' 

    def lookups(self, request, model_admin): 
     return (
      ('Yes', 'Yes'), 
      ('No', 'No'), 
     ) 

    def queryset(self, request, queryset): 
     if self.value() == 'Yes': 
      return queryset.filter(...) 
     if self.value() == 'No': 
      return queryset.filter(...) 

class ProjectAdmin(admin.ModelAdmin): 
    list_filter = (HasImageFilter,) 

Я оставлю вас, чтобы написать фильтрацию QuerySet (комментарий, если вы застряли, и я заполню его).

+0

Это только django 1.4, правильно? Проект все еще на 1.3, поэтому я подожду немного. Но если другого решения нет, я постараюсь обновить его. благодаря! – underdoeg

+0

это приятное отношение :) +1 – Jingo

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