alex5e
@alex5e

Как в Django создать атрибут модели без добавления поля в БД?

У меня определена модель Article в models.py

class Article(models.Model):
    title = models.CharField(max_length=256)
    slug = models.SlugField(max_length=256)
    short_content = RichTextField(config_name='awesome_ckeditor')
    full_content = RichTextField(config_name='awesome_ckeditor')
    cover = models.ImageField(blank=True, upload_to='uploaded_images')
    cropping = ImageRatioField('cover', '200x200')
    show = models.BooleanField(default=0)
    visits = models.BooleanField(default=0)


команда makemigrations сгенерит мне sql для создания таблицы в БД с соотв. полями
Как мне сделать, чтобы, атрибут cropping в модели был (нужно для создания миниатюр изображений в админке), но при этом отдельное поле в БД для него не создавалось?
  • Вопрос задан
  • 399 просмотров
Решения вопроса 1
neatsoft
@neatsoft
Life is too short for bad software
Для этого можно использовать либо property:
import os

from django.db import models


class Article(models.Model):
    title = models.CharField(
        max_length=200,
    )
    image = models.ImageField(
        blank=True,
        upload_to='images',
    )

    @property
    def thumbnail(self):
        if self.image:
            path, filename = os.path.split(self.image.url)
            name, ext = os.path.splitext(filename)
            filename = 'prefix_' + name + '_suffix' + ext
            return os.path.join(path, filename)


либо функцию:
import os

from django.contrib import admin
from django.utils.html import format_html


@admin.register(Article)
class ArticleAdmin(admin.ModelAdmin):
    list_display = (
        'title',
        'get_thumbnail',
    )
    fields = (
        'title',
        'get_thumbnail',
    )
    readonly_fields = (
        'get_thumbnail',
    )

    def get_thumbnail(self, obj):
        if obj.image:
            path, filename = os.path.split(self.image.url)
            name, ext = os.path.splitext(filename)
            filename = 'prefix_' + name + '_suffix' + ext
            return format_html('<img src="{}">', os.path.join(path, filename))
    get_thumbnail.short_description = 'Thumbnail'
    get_logo.admin_order_field = 'image'


либо и то, и другое:
import os

from django.contrib import admin
from django.utils.html import format_html


@admin.register(Article)
class ArticleAdmin(admin.ModelAdmin):
    list_display = (
        'title',
        'get_thumbnail',
    )
    fields = (
        'title',
        'get_thumbnail',
    )
    readonly_fields = (
        'get_thumbnail',
    )

    def get_thumbnail(self, obj):
        url = obj.thumbnail
        return format_html('<img src="{}">', url) if url else ''
    get_thumbnail.short_description = 'Thumbnail'
    get_logo.admin_order_field = 'image'
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы