django imagefield upload_to не работает вообще - PullRequest
3 голосов
/ 06 января 2012

Я написал простое приложение django для тестирования ImageField, но столкнулся с проблемой, когда upload_to просто не работает.Ниже приведен код:

  1 from django.db import models
  2 
  3 # Create your models here.
  4 class TestImage(models.Model):
  5     img = models.ImageField(max_length=256, upload_to='images')

В моем файле settings.py у меня есть:

  2 from os.path import dirname, join, abspath
  3 __dir__ = dirname(abspath(__file__))
 50 MEDIA_ROOT = join(__dir__, 'static')
 55 MEDIA_URL = '/media/'

Затем я запускаю оболочку python, используя manage.py:

jchin@ubuntu:~/workspace/testimage$ ./manage.py shell
Python 2.7.1+ (r271:86832, Apr 11 2011, 18:05:24) 
[GCC 4.5.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> import settings
>>> from image_app.models import TestImage
>>> p = TestImage(img='test.jpg')
>>> p.save()
>>> p.img.name
'test.jpg'
>>> p.img.path
u'/home/jchin/workspace/testimage/static/test.jpg'
>>> p.img.url
'/media/test.jpg'

Как видно из результата, django полностью проигнорировал мой параметр 'upload_to'.Что я не могу понять, почему.Из документации я должен ожидать, что p.img.path вернет "/home/jchin/workspace/testimage/static/images/test.jpg", а в БД, хранящей "images / test.jpg", верно?Но БД просто хранит только имя файла:

mysql> select * from image_app_testimage;
+----+-----------+
| id | img       |
+----+-----------+
|  1 | test.jpg  |
+----+-----------+
1 rows in set (0.00 sec)

Я проверил всю документацию и не смог найти, что я делаю неправильно.У кого-нибудь есть идеи?Я использую django 1.2.5, и он должен поддерживать upload_to.

Пожалуйста, помогите!John

Ответы [ 4 ]

8 голосов
/ 06 января 2012

Но upload_to для загрузки, как следует из названия.Вы не загружаете, вы назначаете изображение напрямую.Только когда вы создаете объект FileField - например, путем загрузки из формы - используется upload_to.

2 голосов
/ 08 октября 2014

Даниэль Роузман прав, upload_to используется только при создании объекта FileField.

Если вы делаете что-то менее традиционным способом (в моем случае отдельный процесс помещает файл в каталог и просто сообщает Django о его существовании), чтобы использовать свойство .url в FileField / ImageField, на вас могут работать:

import os

from django.core.files.storage import FileSystemStorage
from django.db import models


class Video(models.Model):
    video = models.FileField(
        upload_to=settings.VIDEO_MEDIA_URL,
        storage=FileSystemStorage(
            location=settings.VIDEO_FILES_PATH,
            base_url=os.path.join(settings.MEDIA_URL, settings.VIDEO_MEDIA_URL)
        ))

и в settings.py:

MEDIA_URL = '/media/'
VIDEO_MEDIA_URL = 'videos/'  # Note: Trailing slash required.

Теперь свойство url должно возвращать правильный путь:

>>> from test_app.models import Video
>>> p = Video(video='test.mp4')
>>> p.save()
>>> p.video.name
'test.mp4'
>>> p.video.path
u'/home/alukach/Projects/test/media_dir/videos/test.mp4'
>>> p.video.url
'/media/videos/test.mp4'
0 голосов
/ 14 января 2019

Это работает для меня ...

Models.py

img = models.ImageField(upload_to='static/images', default='', blank=True)

Admin.py

class TestImage(admin.ModelAdmin):
    fieldsets = [['Some text', {'fields': ['img']}],]

И Boom вы можете загрузить свое изображение.

0 голосов
/ 31 августа 2018

Между прочим, важно иметь enctype = "multipart / form-data" часть объявления формы в шаблоне HTML, в противном случае FileField / ImageField может работать некорректно.

...