2017-01-02 2 views
0

instance.id возвращает None при загрузке изображений через страницу администратора. Идея состояла в том, чтобы загрузить все изображения каждого Резидента в другую папку. Вот мой код:django instance.id = None при загрузке изображения

models.py

from django.db import models 
import os 

def get_image_path(instance, filename): 
    return os.path.join('photos', "residence_%s" % instance.id, filename) 


# Create your models here. 
class Residence(models.Model): 
    big_image = models.ImageField("Main Image",upload_to=get_image_path) 
    small_images = models.ImageField("Small Images",upload_to=get_image_path, blank=True, null=True) 

settings.py

MEDIA_URL = '/media/' 

EDIT: Это работает, если изменить образ после того, как модель уже добавлена.

+0

Попробуйте с instance.pk –

+0

все еще не возвращался None –

+0

Это не потому, что экземпляр еще не был сохранен в таком случае. –

ответ

1

Вы не можете сделать это таким образом, если вы не реализуете свое настраиваемое поле для загрузки динамического файла. Потому что вы пытаетесь получить доступ к instance.id, но instance еще не сохранен и не имеет id.

Здесь некоторые ресурсы, которые помогут вам достичь того, чего вы хотите:

-1

Еще один хороший способ решить эту проблему, которая требует гораздо меньше кода будет иметь ваша модель использует UUID для первичного ключа, а не для идентификатора базы данных. Это означает, что в момент, когда модель сохраняется в первый раз, UUID уже известен и может использоваться с любыми обратными вызовами upload_to.

Так что для исходного примера вы могли бы сделать что-то вроде этого

from django.db import models 

import uuid 
import os 

def get_image_path(instance, filename): 
    return os.path.join('photos', "residence_%s" % str(instance.id), filename) 

# Create your models here. 
class Residence(models.Model): 
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) 
    big_image = models.ImageField("Main Image",upload_to=get_image_path) 
    small_images = models.ImageField("Small Images",upload_to=get_image_path, blank=True, null=True) 

Смотрите Django's UUIDField reference для получения дополнительной информации