Язык программирования Python

Создание блога на Django. Часть 3: Панель администрирования

Одна из самых интересных вещей в 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 позволяет нам создавать и менять панель для удобного управления нашим сайтом.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *