kentuck1213
@kentuck1213

Как отобразить архив статей?

admin.py:
class ArticleAdmin(admin.ModelAdmin):
    list_display = ('id', 'title', 'author', 'status', 'sub_category', 'show_on_main')
    list_editable = ('status', 'show_on_main')
    inlines = (ParagraphInline,)
    list_per_page = 20
    actions = ['delete_selected']

    def get_queryset(self, request):
        if not request.user.is_superuser and not request.user.groups.filter(name='Moderation'):
            return Article.objects.filter(author=request.user, archive=False)
        return Article.objects.filter(archive=False)

    def delete_model(self, request, obj):
        obj.archive = True
        obj.save()

    def delete_selected(self, request, obj):
        for item in obj:
            item.archive = True
            item.save()

Переде удалением статьи устанавливаю ей archive = True затем создаю новую ArchiveAdmin:
class ArchiveAdmin(admin.ModelAdmin):
    list_display = ('id', 'title', 'author', 'status', 'sub_category', 'show_on_main')
    inlines = (ParagraphInline,)
    list_per_page = 20

    def get_queryset(self, request):
        return Article.objects.filter(archive=True)

В конце поместил :
admin.site.register(Article, ArticleAdmin)
admin.site.register(Article, ArchiveAdmin)

Но Django ругается:
django.contrib.admin.sites.AlreadyRegistered: The model Article is already registered

Есть у кого идеи как это можно реализовать ?
  • Вопрос задан
  • 211 просмотров
Решения вопроса 1
Assargin
@Assargin
Перед ответом смотрю наличие ✔ в ваших вопросах
К сожалению, на одну и ту же модель нельзя зарегистрировать более 1 класса админки.
Есть вариант с прокси-моделью, посмотрите здесь. Там даже тема схожая - публикации.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@alex_vv
Перешел с Sharepoint на Python/Django - счастлив!
На всякий случай, есть второй вариант.

Если в Django настроить два админ-сайта, например, один для пользователей с ограниченными набором моделей, а второй - для админа со всеми моделями и/или с архивными записями.
Из вопроса прослеживается, что архитектура проекта как раз предполагает разнести работу с моделями (зачем-то же архивные статьи вынесены отдельно?)

Тогда можно не создавать прокси для каждой "архивируемой" модели (если их много), а легко зарегистрировать одну и ту же модель в разных админках:

# для всех 
admin.site.register(Article, ArticleAdmin)
# для админа и модераторов архива
archive.register(Article, ArchiveAdmin)


В примере:
  1. `archive` - это второй админ-сайт
  2. видно, что на одну модель возможно прописать два разных класса админки

Отдельная админка под отдельным `url` прописывается 2-3 строчками в `urls.py` в корне проекта, в документации есть.

С прокси тоже легко; из плюсов - на прокси можно добавить отдельные менеджеры объектов и играть с правами доступа и разрешениями пользователей в дополнение к тому, что модель отдельно вынесена в админке.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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