s77lanselot77s
@s77lanselot77s

Как в 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 в модели был (нужно для создания миниатюр изображений в админке), но при этом отдельное поле в БД для него не создавалось?
  • Вопрос задан
  • 98 просмотров
Решения вопроса 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'
    Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через TM ID
Похожие вопросы