2016-03-26 9 views
1

ImageFieldで参照できるバックエンドに画像を保存しようとしていますが、ImageFieldでユーザーとヘッドショットをリンクすることができます。私はTastyPieでこれを行う方法についてのドキュメントは幸運にもありませんでした。django ImageFieldをTastypieで使用する

HTMLページに表示されるバックエンドからイメージを取得するために必要な最小実行可能な手順は何ですか?

models.py

from django.db import models 

class User(models.Model): 
    name = models.CharField(max_length=100) 
    headshot = models.ImageField() 

settings.py

MEDIA_URL = '/media/' 

api.py

:ここ

は私がしようとしているかの私のコードです

from tastypie.resources import ModelResource 
from tastypie import fields 
from blog.models import User 

class UserResource(ModelResource): 
    headshot = fields.FileField(attribute='headshot', null=True, blank=True) 

    class Meta: 
     queryset = User.objects.all() 
     resource_name = 'users' 

urls.py(settings.pyと同じ)マイメディアフォルダは私のプロジェクトのディレクトリに配置されて

from django.conf.urls import include, url 
from django.contrib import admin 

from tastypie.api import Api 

from blog.api import UserResource 

blog = Api(api_name='v1') 
blog.register(UserResource()) 

urlpatterns = [ 
    url(r'^admin/', include(admin.site.urls)), 
    url(r'^blog/', include(blog.urls)) 
] 

テスト画像の場所 - >/MyProjectと/ media/images/nickbrady.jpg

  • api.pyはinsidです

    User.objects.create(name='Nick Brady', headshot='images/nickbrady.jpg') 
    

    と私の現在のAPIレスポンスです:

  • URLおよびモデル(同じmodels.pyなど)の電子私のDjangoのアプリは、私はこのような私のユーザーオブジェクトが作成さ

その標準Djangoの場所にありますこの:

{ 
    "meta": { 
    "limit": 20, 
    "next": null, 
    "offset": 0, 
    "previous": null, 
    "total_count": 1 
    }, 
    "objects": [ 
    { 
     "headshot": "/media/images/nickbrady.jpg", 
     "id": 1, 
     "img": null, 
     "name": "Nick Brady", 
     "resource_uri": "/blog/v1/users/1/" 
    } 
    ] 
} 

私は

に行くことにしてみてください3210

またはブログ/ v1 /メディアを追加する他の多くの組み合わせなど。私はブラウザやHTMLページから画像を見ることができません。

誰かが迷っていることを知っていますか?私はあなたのエラーの詳細を提供していないtastypie

+0

ブラウザでこのURLを開いているときに、どのようなエラーが発生していますか? –

答えて

1

これはあなたの問題である可能性があります:

User.objects.create(name='Nick Brady', headshot='images/nickbrady.jpg') 

そのファイルがあなたの中にその場所にすでにある場合を除き実際にはファイルを参照しません。そのファイルを保存するにはhttps://docs.djangoproject.com/en/1.9/ref/files/file/

はあなたの格納ディレクトリにコピーされます:

はおそらく、このクラスのファイルオブジェクトをラップし、その文字列の代わりに保存したいです。

+1

Sean、ご返信ありがとうございます。私は明日これを試して、ストレージディレクトリについてのいくつかの調査を行います。それは、うまくいく新しい素晴らしい魚のように聞こえます。私はこれがうまくいくなら答えとして受け入れることを忘れないだろう。ありがとう! –

+0

その一部、ありがとう! +1 –

1

でこれを行う方法についてのドキュメントを見つけるのは本当に苦労がありましたので、あなたはより多くの詳細を提供する場合、私はすることができます間違っているのです!だから何ちょうど推測は私がよそれが間違っている場合は削除してください!
多分問題は、あなたが怒鳴るようなあなたのsettings.pyファイルにMEDIA_ROOTを設定していないということです。

MEDIA_ROOT = os.path.join(BASE_DIR, 'media') 
+0

こんにちは@ iman-mirzadeh、それは404エラーです。私はあなたがどこかで言及したものを見て、それを利用しようと試みました。私はそれをもう一度追加し、指定したブラウザで画像を見ることができませんでした。応答ありがとう! –

+0

その一部、ありがとう! +1 –

1

他の2つの回答の助けを借りてドキュメントを掘り下げて解決策を見つけることができました。

私は変更しなければならなかった:

MEDIA_URL = '/media/' 
MEDIA_ROOT = BASE_DIR + '/media/' # Added this 

そして、私は私のユーザーを作成しました:へ urls.py:イマンはsettings.pyに提案されているよう

from django.conf.urls import include, url 
from django.conf.urls.static import static # Added this line 
from django.contrib import admin 

from tastypie.api import Api 

from blog.api import UserResource 

blog = Api(api_name='v1') 
blog.register(UserResource()) 

urlpatterns = [ 
    url(r'^admin/', include(admin.site.urls)), 
    url(r'^blog/', include(blog.urls)) 
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) # And this 

は私が設定にMEDIA_ROOTを追加しました私のUserオブジェクトを作成するときに、ファイルオブジェクトをdjangoファイルクラスにラップするためにSean(これは必須)から助言を受けました。 I used the image classこれは、djangoファイルクラスの薄いラッパーです。

./manage.pyシェルのようになります。

>>> from django.core.files.images import ImageFile 
>>> img_file = open('path/to/file.jpg', 'rb') # 'rb' --> read as bytes since image 
>>> django_wrapped_img = ImageFile(img_file) 
>>> User.objects.create(name='Nick Brady', headshot=django_wrapped_img) 

このようにオブジェクトを作成した後、イメージは自分のMEDIA_ROOTが指定された場所にコピーされました。

私がこれをした後、私は郵便配達員から私のイメージを正常に見るために過ごしました。

注:この時点では、コンテンツを直接バックエンドに置いているため、この時点ではメディアとは対照的にstatic_urlとルートを使用する方が適切です。メディアは、私が発見したユーザーのアップロードを処理するためのものです。それは私の将来の意図なので、私はこのように残しています。

+0

'+ static(settings.MEDIA_URL、document_root = settings.MEDIA_ROOT)'を 'DEBUG = True'のときにのみ実行されるif文に入れるべきです。 –

関連する問題