Site/blog/admin.py

93 lines
3.6 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

from django.contrib import admin
from .models import Category, Article, Comment
from django.db import models
from django_ckeditor_5.widgets import CKEditor5Widget
from django.utils.html import format_html
from django.urls import reverse
@admin.register(Category)
class CategoryAdmin(admin.ModelAdmin):
list_display = ('name', 'slug', 'description')
prepopulated_fields = {'slug': ('name',)}
search_fields = ('name',)
@admin.register(Article)
class ArticleAdmin(admin.ModelAdmin):
formfield_overrides = {
models.TextField: {'widget': CKEditor5Widget(config_name='default')},
}
list_display = ('title', 'category', 'author', 'is_published', 'views_count', 'time_create', 'tag_list')
list_filter = ('is_published', 'category', 'tags', 'time_create')
search_fields = ('title', 'content', 'tags__name')
prepopulated_fields = {'slug': ('title',)}
autocomplete_fields = ('author',) # вместо raw_id_fields для удобства
# filter_horizontal = ('tags',) # для удобного выбора тегов
raw_id_fields = ('author',) # удобно при большом количестве пользователей
date_hierarchy = 'time_create'
actions = ['make_published', 'make_unpublished']
fieldsets = (
(None, {
'fields': ('title', 'slug', 'category', 'author', 'tags', 'is_published')
}),
('Содержание', {
'fields': ('content', 'image'),
'description': 'Основной текст статьи. Используйте редактор для форматирования.'
}),
('SEO', {
'fields': ('meta_description',),
'classes': ('collapse',),
}),
('Служебное', {
'fields': ('views_count',),
'classes': ('collapse',),
}),
)
readonly_fields = ('views_count',) # только для просмотра
def get_queryset(self, request):
return super().get_queryset(request).prefetch_related('tags')
def tag_list(self, obj):
return ", ".join(o.name for o in obj.tags.all())
tag_list.short_description = "Теги"
def make_published(self, request, queryset):
queryset.update(is_published=True)
make_published.short_description = "Опубликовать выбранные статьи"
def make_unpublished(self, request, queryset):
queryset.update(is_published=False)
make_unpublished.short_description = "Снять с публикации"
# Добавляем кнопку предпросмотра для черновиков
def view_on_site(self, obj):
if obj.is_published:
return obj.get_absolute_url()
else:
# ссылка на предпросмотр черновика
return reverse('blog:draft_preview', args=[obj.slug])
view_on_site.short_description = "Предпросмотр"
@admin.register(Comment)
class CommentAdmin(admin.ModelAdmin):
list_display = ('author_name', 'article', 'is_moderated', 'time_create')
list_filter = ('is_moderated', 'time_create')
search_fields = ('author_name', 'author_email', 'content')
actions = ['approve_comments', 'reject_comments']
def approve_comments(self, request, queryset):
queryset.update(is_moderated=True)
approve_comments.short_description = "Одобрить выбранные комментарии"
def reject_comments(self, request, queryset):
queryset.update(is_moderated=False)
reject_comments.short_description = "Отклонить выбранные комментарии"