Изменение логики работы полей в админке Django
Обычно стандартного представления модели в админке джанго достаточно для целей редактирования и добавления материалов. Однако когда модель усложняется и хочется автоматизировать некоторые действия при наполнении сайта (создание ссылки для ЧПУ, проверка корректности имен файлов картинок) можно воспользоваться расширением моделей административного интерфейса (ModelAdmin).
Рассмотрим пример генерирования ЧПУ ссылки из заголовка новости.
У нас есть модель новости (model.py):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
#coding: utf-8 from django.db import models from pytils import translit # News class News(models.Model): title = models.CharField(max_length=100) code = models.CharField(max_length=100) date = models.DateField(auto_now_add=True) announce = models.TextField() detail = models.TextField() def __unicode__(self): return self.title @property def detail_url(self): result_str = ''.join(['/news/',str(self.id),'/',self.code,'/']) return result_str @property def list_url(self): result_str = '/news/' return result_str class Meta: verbose_name = u'Новость' verbose_name_plural = u'Новости' |
Как видно из описания модели, полный путь к новости выглядит как /news/<числовой идентификатор>/<символьный код>/. Числовой код у нас автоматически генерируется при добавлении записи, а вот символьный код мы должны откуда-то брать. В данной модели у нас символьный код система предлагает вводить вручную, что при массовом создании новостей утомляет. Однако, вполне может устроить вариант, когда символьный код генерируется из заголовка новости (поле title). Для реализации этого функционала воспользуемся возможностью перекрывать поведение модели данных в административном интерфейсе, сделав наследника от класса ModelAdmin.
Для реализации создаём файл admin.py в папке с приложением. С содержимым:
1 2 3 4 5 6 7 8 9 10 11 12 |
#coding: utf-8 from news.models import News from django.contrib import admin from pytils import translit class NewsAdmin(admin.ModelAdmin): exclude = ('code',) def save_model(self, request, obj, form, change): obj.code = translit.slugify(obj.title) obj.save() admin.site.register(News,NewsAdmin) |
Во-первых, мы здесь убираем вывод поля символьного кода в админке новостей строчкой
1 |
exclude = ('code',) |
затем устанавливаем обработчик на событие сохранения модели и устанавливаем значение поля code транслитерацией из заголовка новости, и сохраняем новость
1 2 |
obj.code = translit.slugify(obj.title) obj.save() |