desperadik
@desperadik
Истина где-то рядом.

ForeignKey для list_filter, как?

В проекте используется две админки (админка юзеров+админка для юзеров(АЮ))

В АЮ используется модель типа:
class Document(model.Models):
    title = models.CharField(_('title'), max_length=500)
    file = models.FileField(_('file'), upload_to='documents')
    order = models.IntegerField(_('order'), default=0)
    dtype = models.ForeignKey(to=DocType, blank=True, null=True)

class DocType(model.Models):
    title = models.CharField(_('title'), max_length=500)
    order= models.SmallIntegerField(verbose_name=u"Вес")


Для изоляции отображения в АЮ в поле выбора DocType в admin.py есть метод:

def formfield_for_foreignkey(self, db_field, request=None, **kwargs):
        field = super(DocumentAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)
        if db_field.name == 'title' or db_field.name == 'order' or db_field.name == 'dtype':
            if request.АЮ_site is not None:
                    field.queryset = field.queryset.filter(АЮ_site=request.АЮ_site)
            else:
                    field.queryset = field.queryset.none()
        return field


Но если в admin.py добавить для класса DocumentAdmin filter_list=['dtype'], то в списке отображаются все Doctype (не только созданные этим пользователям).

Как быть?

Предопределять свой фильтр для каждого случая, пример ТУТ?

п.с. dj-1.6
  • Вопрос задан
  • 2921 просмотр
Решения вопроса 1
desperadik
@desperadik Автор вопроса
Истина где-то рядом.
Написал свой фильтр.

class TypeFilter(SimpleListFilter):
    title = u'Тип документа'
    parameter_name = 'dtype'

    def lookups(self, request, model_admin):
        records = DocType.objects.all().filter(user_site=request.user_site)
        list_1 = []
        list_2 = []
        for data in records:
            list_1.append(data.title)
        for f in map(lambda x, y: (x, y), iter(list_1), iter(list_1)):
            list_2.append(f)
        return tuple(list_2)

    def queryset(self, request, queryset):
        records = DocType.objects.filter(user_site=request.user_site)
        for data in records:
            if self.value() == data.title:
                records = queryset.filter(dtype=data)
                return records

class DocumentAdmin(ModelAdmin)
      list_filter = (TypeFilter, )
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@mefisto
Мне кажется что Вам нужно гуглить в сторону row level permissions
или как пример вот - django-guardian.readthedocs.org/en/v1.2
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы