93 lines
3.6 KiB
Python
93 lines
3.6 KiB
Python
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 = "Отклонить выбранные комментарии"
|
||
|
||
|