Как определить, загрузил ли пользователь поле ImageField или FileField?

У меня есть следующая модель и функция для установки путей загрузки либо файлов изображений, либо других файлов (которые будут аудиофайлами).

def upload_to(instance, filename):
    # Check for image or sound file and put in appropriate directory
    if isinstance(instance, models.ImageField):
        print("detected image file")
        return "x/img/%s" % (filename)
    else:
        print("detected non-image file")
        return "x/aud/%s" % (filename)

class Tile(models.Model):
    image = models.ImageField(upload_to=upload_to, default="../static/x/img/default.svg")
    sound = models.FileField(upload_to=upload_to, null=True, blank=True)

Последнее условие в upload_to некорректно, я понимаю, так как instance - это экземпляр объекта tile со всеми полями, но я не уверен, что нужно сделать в функции upload_to, чтобы узнать, является ли файл, только что загруженный пользователем, ImageField или FileField.

Можно ли иметь две отдельные функции upload_to, по одной для каждого типа поля/файла?

def upload_to_image(instance, filename):
    return "x/img/%s" % (filename)

def upload_to_sound(instance, filename):
    return "x/aud/%s" % (filename)

class Tile(models.Model):
    image = models.ImageField(upload_to=upload_to_image, default="../static/x/img/default.svg")
    sound = models.FileField(upload_to=upload_to_sound, null=True, blank=True)

На самом деле, если вам просто нужны отдельные каталоги для каждого типа поля, похоже, что вы можете передать это непосредственно в поле upload_to:

class Tile(models.Model):
    image = models.ImageField(upload_to="x/img/", default="../static/x/img/default.svg")
    sound = models.FileField(upload_to="x/aud/", null=True, blank=True)

и полностью опустить функции обратного вызова.

Вернуться на верх