Переименуйте файлы, загруженные в Django admin, и пропустите поля в форме - PullRequest
0 голосов
/ 04 мая 2020

Я использую Django 3.0.5 и хочу загрузить изображения в Django admin.

Я пытаюсь:

1) изменить имя файла загруженной папки мультимедиа на основе данных изображения.

2) Пропустить поля в отображаемой форме, поскольку они автоматически сгенерировано.

Модель зарегистрирована в admin.py

Это мой код в models.py:

from django.db import models
from hashlib import md5
from PIL import Image
from io import BytesIO

class NewImage(models.Model):

    image_name = models.CharField(max_length=255, default='')
    pub_date = models.DateTimeField(auto_now=True)
    image = models.ImageField(upload_to='images/')
    height = models.IntegerField(default=0)
    width = models.IntegerField(default=0)
    extension = models.CharField(max_length=20, null=False, default='')
    image_hash = models.CharField(max_length=50, null=False, unique=True, db_column='hash', default='')

    def __str__(self):
        return self.image_name

    @staticmethod
    def hash_exists(hash):
        return NewImage.objects.filter(image_hash=hash).exists()

    def generate_name(self):
        try:
            img_id = NewImage.objects.values('id').order_by('-id').first()['id'] + 1
        except:
            img_id = 1
        self.image_name = "%s_%s" % (img_id, self.image_hash[-4:])

    def save(self, *args, **kwargs):
        img = Image.open(self.image)
        self.image_hash = md5(img.tobytes()).hexdigest()

        if not self.pk:
            try:
                if self.hash_exists(self.image_hash):
                    raise ValueError("image hash already exists, duplicate image!")
            except ValueError as err:
                print(err.args)
                return ""

        self.width, self.height = img.size
        self.extension = img.format.lower()
        self.generate_name()

        super(NewImage, self).save(*args, **kwargs)

1) Как я могу получить файл в папка мультимедиа будет image_name

2) Для пропуска полей. Основываясь на ответах SOF, я попробовал следующее (это не работает) в forms.py:

from django import forms
from django.contrib import admin
from .models import NewImage

class NewImageForm(forms.ModelForm):

    class Meta:
        model = NewImage
        exclude = ['image_name','height','width','extension','image_hash']

class NewImageAdmin(admin.ModelAdmin):
    exclude = ['image_name','height','width','extension','image_hash']
    form = NewImageForm
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...