Это только набросок - нужно все опробовать на живом коде.
class NewsPost(models.Model):
"""Новость"""
authors = models.ManyToManyField(User, blank = True, null = True)
В админке она представлена так:
class NewsPostAdmin(admin.ModelAdmin):
"""Представление Новости в админке"""
# фильтрация новостей по автору
list_filter = ('authors',)
def formfield_for_manytomany(self, db_field, request, **kwargs):
"""Специальная фильтрация для списка допустимых авторов
Данная фильтрация распространяется только на поле authors в
форме редактирования новости в админке
"""
if db_field.name == 'authors':
kwargs['queryset'] = User.objects.filter(is_staff=True)
return super(PostAdmin, self).formfield_for_manytomany(
db_field, request, **kwargs)
В итоге в форме редактирования новости в админке в качестве автора можно будет указать только пользователя со статусом Персонал (Staff), но для фильтра списка новостей будут выведены все пользователи системы.
Из документации по админке Django сказано, что в list_filter можно указывать только название поля:
Set list_filter to activate filters in the right sidebar of the change list page of the admin. This should be a list of field names, and each specified field should be either a BooleanField, CharField, DateField, DateTimeField, IntegerField or ForeignKey.Но если посмотреть код в django.contrib.admin.views.main.ChangeList, метод get_filters() то увидим следующее:
Fields in list_filter can also span relations using the __ lookup:
...
filter_specs = []
if self.list_filter:
for list_filter in self.list_filter:
if callable(list_filter):
# This is simply a custom list filter class.
spec = list_filter(request, lookup_params,
self.model, self.model_admin)
else:
...
Оказывается в list_filter можно указать "какой-то" класс, экземпляр, которого будет создан для фильтрации. Классы эти можно увидеть вот тут: django.contrib.admin.filters.
To be continued...
Комментариев нет:
Отправить комментарий