Django сохранить изображение с помощью экземпляра upload_to сохраняет свойства экземпляра - PullRequest
1 голос
/ 15 марта 2012

Я пытаюсь дать загруженному изображению более хороший путь, используя этот код (в models.py):

def get_image_path_photos(instance, filename):
return os.path.join('photos', str(instance.someproperty), filename)

и модель

class Photo(models.Model):
someproperty = models.CharField(max_length=17, blank=False, null=False, default="something")
photo = models.ImageField(upload_to=get_image_path_photos, blank=True, null=True)

Когда я сохраняю это после новой вставки, он сохраняет его в пути / photos / что-то / (он продолжает использовать значение по умолчанию). Когда я отредактирую это, добавлю фотографию и сохраню ее, она сохранит ее по правильному пути. Поэтому он должен что-то сделать, сохраняя новый объект, он еще не существует.

Я пытался сделать то же самое с instance.id, и это также остается None (я читал, используя автоприращение для идентификатора, это решает, но это звучит так же, как использование значения по умолчанию, и использование pk / id по умолчанию - auto приращение).

Я нашел несколько похожих вопросов, но ни один из них не дал ответа, который решал бы мою проблему.

Я думал о том, чтобы использовать сигнал pre_save .... но почему-то мои внутренности говорят, что это неправильный путь.

Решение моей проблемы. Я нашел myselve, пожалуйста, посмотрите мой ответ ... Хороший урок, не используйте определения slugname так же, как имена полей .....

1 Ответ

0 голосов
/ 15 марта 2012

Извините за это.Проблема немного сложнее.Я использую поле someproperty также в URL-адресе в качестве заголовка сообщений ... Я только что обнаружил то, чего не ожидал.

Я сделал свой пост (используя django rest framework) из URL-адреса, используязначение по умолчанию в URL-адресе ... но я заполнил поле чем-то другим.

чем, потому что я определяю slugname так же, как имя поля, оно перезаписывает все, что вы заполняете в поле значениемиз URL .... Это не совсем то, что я хотел сделать, но имеет смысл.

Возможно, решение состоит в том, чтобы называть имя слага не совпадающее с именем поля ......

Я сохраняю этот вопрос и отвечаю в любом случае, потому что для меня это была довольно загадка ..... (может быть, кому-то поможет)

как дополнение к ответу jpicЯ использовал URL-адреса в Django остальном Framwwork, скажем так;http: \ someurl \ api \ photos \\ и опубликуйте там фотографию.

размещение фотографии avatar_big.png с помощью someproperty = bar:

сохранил фотографию в фотографиях \ что-то \ при использованииURL http \ someurl \ api \ photos \ что-то

и сохранил фотографию в photos \ bar \ при использовании URL http: \ someurl \ api \ photos \ bar

проблема в том, что (ядумаю, еще нужно проверить это), что имя слага, которое я использую для URL, совпадает с именем поля.

это код, который я использую в views.py (представление на основе классов, которое я использую в django-rest-framework):

class PhotoBySomePropertyListOrCreateModelView(ListOrCreateModelView):
permissions = (IsAuthenticated, )
form = PhotoForm
def get_queryset(self):
    someproperty=self.kwargs['someproperty']
    return Photo.objects.filter(someproperty=someproperty)

и в urls.py:

url(r'^api/photos/(?P<someproperty>[\w:]+)/$', PhotoBySomePropertyListOrCreateModelView.as_view(resource=PhotoResource)),

здесь вы видите проблему, она не слушает поле в 'someproperty', нозначение в URL ....

изменяя его в URL (r '^ api / photos / (? P [\ w:] +) / $', PhotoBySomePropertyListOrCreateModelView.as_view (resource = PhotoResource)),

должен сделать трюк .... и настроить вид конечно

...