Александр Горбач


программирование, админство

Изменение логики работы полей в админке Django

без комментариев

Обычно стандартного представления модели в админке джанго достаточно для целей редактирования и добавления материалов. Однако когда модель усложняется и хочется автоматизировать некоторые действия при наполнении сайта (создание ссылки для ЧПУ, проверка корректности имен файлов картинок) можно воспользоваться расширением моделей административного интерфейса (ModelAdmin).

Рассмотрим пример генерирования ЧПУ ссылки из заголовка новости.
У нас есть модель новости (model.py):

#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 в папке с приложением. С содержимым:

#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)

Во-первых, мы здесь убираем вывод поля символьного кода в админке новостей строчкой

 exclude = ('code',)

затем устанавливаем обработчик на событие сохранения модели и устанавливаем значение поля code транслитерацией из заголовка новости, и сохраняем новость

obj.code = translit.slugify(obj.title)
obj.save()

Автор Sash(k)a

Сентябрь 3rd, 2013 at 5:05 пп

Яндекс.Метрика