3

ImageFieldをテストするための簡単なdjangoアプリを作成しましたが、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/'

次に、manage.pyを使用してPythonシェルを起動します。

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」を格納しているDBに正しいことを期待する必要がありますか?ただし、DBはファイル名のみを保存します。

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

私はすべてのドキュメントをチェックしましたが、間違っていることを見つけることができませんでした。誰かアイデアはありますか?django 1.2.5を使用していますが、upload_toをサポートしているはずです。

助けてください!ジョン

4

4 に答える 4

10

しかしupload_to、名前が示すように、アップロード用です。アップロードするのではなく、画像を直接割り当てます。FileFieldupload_toが使用されるのは、たとえばフォームからアップロードしてオブジェクトを作成する場合のみです。

于 2012-01-06T19:06:23.567 に答える
2

Daniel Rosemanは正しく、upload_toFileFieldオブジェクトを作成するときにのみ使用されます。

従来とは異なる方法で何かを行っている場合(私の場合、別のプロセスでファイルをディレクトリに配置し、Djangoにその存在を通知するだけです)、/の.urlプロパティを使用するには、次のように機能します。 :FileFieldImageField

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'
于 2014-10-08T17:29:12.257 に答える
0

参考までに、HTMLテンプレートのフォーム宣言にenctype = "multipart / form-data"の部分を含めることが重要です。そうしないと、FileField/ImageFieldが適切に機能しない可能性があります。

于 2018-08-31T06:47:40.703 に答える
0

これは私のために働きます...

Models.py

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

Admin.py

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

これで、画像をアップロードできます。

于 2019-01-14T07:07:52.537 に答える