0

ページに一連の画像を表示するビューを作成しています。

これがモデルです

#models.py
class Movie(models.Model):
    title  = models.CharField(max_length = 500)
    poster = models.ImageField(upload_to = 'qanda/static/movie_posters')

#index.html
    <img src = "{{ STATIC_URL }}movie_posters/{{ movie.poster }}"></a>

サーバーを実行すると、画像が表示されません。画像が読み込もうとしている URL は

http://127.0.0.1:8000/static/movie_posters/qanda/static/movie_posters/image.jpg

ロードしようとしているはずの URL が

http://127.0.0.1:8000/static/movie_posters/image.jpg

私の推測では、movie.poster は「qanda/static/movie_posters」にあるため、HTML でレンダリングすると、静的 URL (127.0.0:8000/static) が読み込まれ、次に場所「qanda/static/」が読み込まれます。最後に「movie_posters」。画像を正しくレンダリングするにはどうすればよいですか?

4

3 に答える 3

6

画像 URL の計算方法は 2 つあります。

最初にあなたsettings.pyが定義しますMEDIA_ROOTMEDIA_ROOTメディアが保存されるコンピューター上の絶対フォルダーを指定します。たとえば、これらの設定の場合:

MEDIA_ROOT = '/abs/path/to/media/'

フィールドがある場合

models.ImageField(upload_to='movie_posters')

画像は次の場所に保存されます。

/abs/path/to/media/movie_posters/
/abs/path/to/media/movie_posters/poster.jpg <- example

これは、メディアがハード ドライブのどこに保存されているかを扱います。

2 番目の部分は、これらのメディア ファイルの URL を計算する方法です。そのためには、で定義MEDIA_URLしますsettings.py。これは基本的に URL をあなたのMEDIA_ROOT場所にマップします。したがって、あなたMEDIA_URLが次の場合:

MEDIA_URL = 'http://localhost/media/'

movie_posters/poster.jpg次に、絶対パスが に保存されている画像にアクセスする場合/abs/path/to/media/movie_posters/poster.jpg、その URL は である必要がありますhttp://localhost/media/movie_posters/poster.jpg。次のようにして URL を計算できます。

{{ MEDIA_URL }}{{ movie.poster }}

MEDIA_URLの代わりに使用していることに注意してくださいSTATIC_URL。それらは同じものではありません。ただし、そのような URL を計算するのはあまりうまくいきません。そのため、DjangoImageFieldFileFieldは次のurl属性があります。

{{ movie.poster.url }}

Django は、設定に応じて適切な URL を計算しますMEDIA_URL

ノート:

これらすべてを機能させるには、別のメディア サーバーを実行する必要があります。Django はメディア ファイルを提供しません。開発中は、静的ファイルのみを提供できます (メディア ファイルとは異なります)。したがって、開発中にメディア ファイルを提供するための 1 つの優れた方法は、Python のシンプルな Web サーバーを使用することです。そのためには、新しいターミナル (Linux および Mac の場合) またはコマンド プロンプト (Windows の場合) ウィンドウ/タブを開き、メディア フォルダーに移動します。次に、そこで次のコマンドを実行します。

python -m SimpleHTTPServer 8090

設定が次のようになっていることを確認します。

MEDIA_URL = 'http://localhost:8090/'

すると、Python がメディア ファイルを提供します。それは開発にうまく機能します。

于 2012-10-31T01:25:59.303 に答える
1

開発サーバーのみを使用してメディアを提供したい場合は、当分の間、これを urls.py に追加できます。

urlpatterns = patterns( ...all your awesome urls...) + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
于 2012-10-31T05:51:25.497 に答える
0

次のように、URL のベース名を返すカスタム テンプレート タグを定義できます。

from django import template
import os

register = template.Library()

@register.filter
def getBasename(myURL):
   return os.path.basename(myURL)

これは、アプリのtemplatetagsディレクトリ内のカスタム テンプレート タグ (例: customTemplateTags.py) ファイルに入れる必要があります。

次に、フィルタを使用して、URL 全体ではなく画像ファイル名のみを取得できます。

{% load customTemplateTags %}
<img src = "{{ STATIC_URL }}movie_posters/{{ movie.poster.url|getBasename }}"></a>
于 2012-10-31T01:44:56.923 に答える