Сохраняйте ImageField в разные папки

У меня есть две модели, которые наследуются от базовой модели следующим образом

'''

 games = [
    ('DND5E', 'Dungeons and Dragons'),
    ('TOR20', 'Tormenta20'),
    ]
    
    class BaseSheet(models.Model):
        ...
        game: str = models.CharField(default='', max_length=5, choices=games)
        ...

    class DnDMonster(BaseSheet):
        ...
        image = models.ImageField(upload_to='images/monsters/DnD5e')
        ...

    class Tor20Monster(BaseSheet):
        ...
        image = models.ImageField(upload_to='images/monsters/Tor20')
        ...

'''

По моему мнению, так будет лучше организовано, и я смогу размещать изображения из разных игр в разных папках, а не в одной огромной папке со всем, что в ней находится

У меня есть некоторые проблемы, когда я хочу, чтобы мой клиент видел все, что наследуется от BaseSheet и их изображения, поэтому я хочу поместить это ImageField в BaseSheet. Когда я пытаюсь это сделать, кажется, что я не могу поместить изображения в разные папки в зависимости от того, какая игра у монстра. Есть ли способ сделать это? Есть ли лучший способ сделать это?

Я не уверен, будет ли это работать. Но если вы добавите поле изображения в базовую модель, но будете создавать новые объекты только в модели вашего подкласса, это, вероятно, может сработать:

def image_upload_path(instance, filename):
    if isinstance(instance, DnDMonster):
        return 'images/monsters/DnD5e/{0}'.format(filename)
    if isinstance(instance, Tor20Monster):
        return 'images/monsters/Tor20/{0}'.format(filename)
    return 'images/monsters/somefallbackpath/{0}'.format(filename)


class BaseSheet(models.Model):
    ...
    image = models.ImageField(upload_to=image_upload_path)
    ...
Вернуться на верх