Одна из самых интересных вещей в Django – это наличие интерфейса администратора. Она считывает метаданные моделей, созданных в нашем проекте, и предоставляет нам быстрый интерфейс для управления содержимым нашего сайта.
Прежде чем получить доступ к панели администратора, нам необходимо внести некоторые изменения в файлы admin.py в наших модулях. Мы начнем с файла users:
Users
Первое, что мы сделаем, это создадим суперпользователя для доступа к панели. Это делается с помощью следующей команды:
python manage.py createsuperuser
Code language: CSS (css)
Эта команда запросит у нас ряд данных для создания пользователя. Далее если мы обратимся к url https://127.0.0.1:8000/admin/, появится окно входа в систему, а мы сможем получить доступ к интерфейсу администрирования.
После входа в систему появится меню, где мы можем добавить группы и пользователей. Здесь отображаются только эти два параметра, поскольку они являются настройками по умолчанию, с которыми поставляется Django.
Откроем наш файл simple_blog/users/admin.py и добавим следующий код:
"""User admin classes.""" # Django from django.contrib.auth.admin import UserAdmin as BaseUserAdmin from django.contrib import admin # Models from django.contrib.auth.models import User from users.models import Profile @admin.register(Profile) class ProfileAdmin(admin.ModelAdmin): """Profile admin.""" list_display = ('pk', 'user', 'photo') list_display_links = ('pk', 'user',) list_editable = ('photo',) search_fields = ( 'user__email', 'user__username', 'user__first_name', 'user__last_name', ) list_filter = ( 'user__is_active', 'user__is_staff', 'date_modified', ) fieldsets = ( ('Profile', { 'fields': (('user', 'photo', 'website'),), }), ('Extra info', { 'fields': (('date_modified'),), }) ) readonly_fields = ('date_modified',)
Здесь мы импортируем библиотеку администратора и наши модели пользователя и профиля. С помощью admin.register(Profile) мы регистрируем нашу модель, в результате чего она появится на панели.
Затем мы создаем класс ProfileAdmin. Именно здесь мы будем размещать пользовательские конфигурации.
- list_display: Он покажет нам список созданных пользователей, когда мы окажемся в разделе профиля. Показанная информация является той, которую мы добавляем в список, в данном случае первичный ключ, пользователь и фотография.
- list_display_links: Добавит ссылку для редактирования в указанные нами поля, в данном случае в первичный ключ и пользователя.
- list_editable: Эта функция позволит нам редактировать фотографию пользователя из панели.
- search_fields: Позволяет осуществлять поиск по добавленным вами полям.
- list_filter: Добавляет панель фильтра с полями, которые мы добавили.
- field_sets: Позволяет настроить, как данные будут отображаться на панели.
- readonly_fields: Данные, которые вы добавите сюда, будут отображаться как доступные только для чтения.
Теперь мы создадим пользователя и профиль на одной и той же панели, чтобы нам не приходилось переходить от одной панели к другой. Это достигается с помощью класса StackedInline. Добавим следующий код в конец нашего файла admin.py:
class ProfileInline(admin.StackedInline): """Profile in-line admin for users.""" model = Profile can_delete = False verbose_name_plural = 'profiles' class UserAdmin(BaseUserAdmin): """Add profile admin to base user admin.""" inlines = (ProfileInline,) list_display = ( 'username', 'email', 'first_name', 'last_name', 'is_active', 'is_staff' ) admin.site.unregister(User) admin.site.register(User, UserAdmin)
Здесь мы создаем класс ProfileInline и храним в нем модель, которую мы хотим добавить к родительской модели.
Затем нам нужно удалить класс User, который используется по умолчанию, и зарегистрировать наш новый класс.
После чего мы объявляем наш новый класс, добавляем класс StackedInline и в list_display помещаем данные, которые мы хотим показать при выводе списка пользователей.
Наконец, мы используем метод unregister для удаления нашего класса User и регистрации нового класса, передавая базовую модель и новый класс.
Post
Давайте создадим панель администратора для постов. Для этого откроем файл simple_blog/posts/admin.py и добавим следующий код:
from django.contrib import admin
# Register your models here.
from posts.models import Post
@admin.register(Post)
class PostAdmin(admin.ModelAdmin):
"""Post admin."""
list_display = ('id', 'user', 'title', 'image_header')
search_fields = ('title', 'user__username', 'user__email')
list_filter = ('created', 'modified')
def get_form(self, request, obj=None, **kwargs):
self.exclude = ('url', )
form = super(PostAdmin, self).get_form(request, obj, **kwargs)
form.base_fields['user'].initial = request.user
form.base_fields['profile'].initial = request.user.profile
return form
Code language: CSS (css)
В данном случае мы добавили метод get_form, который позволяет нам вносить изменения в форму перед ее отображением.
Среди изменений, которые мы сделали, – скрытие url с помощью метода self.exclude и то, что по умолчанию создателем сообщения является пользователь, под которым вы вошли в систему.
Categories
Это довольно просто, достаточно добавить следующий код:
from django.contrib import admin
# Register your models here.
from categories.models import Category
@admin.register(Category)
class CategoryAdmin(admin.ModelAdmin):
"""Category admin."""
list_display = ('id', 'name')
Code language: CSS (css)
Comments
В конце мы создадим панель для комментариев. В данном случае мы будем использовать ее только для списка комментариев, чтобы мы могли искать комментарии, которые не соответствуют нашей политике, и удалять их. Добавим следующий код:
from django.contrib import admin
# Register your models here.
from comments.models import Comment
@admin.register(Comment)
class CommentAdmin(admin.ModelAdmin):
"""Comment admin."""
list_display = ('id', 'user', 'post', 'comment')
Code language: CSS (css)
Заключение
На этом мы закончили работу над административной частью, которая благодаря Django позволяет нам создавать и менять панель для удобного управления нашим сайтом.