2

管理パネルからアップロードされた画像の表示に問題があります。Djangoは間違ったパスをレンダリングします。おそらくどこかで設定ミスが原因です...

これは私のモデル定義です:

class Article(models.Model):
    """News article, displayed on homepage to attract users"""
    class Meta:
        db_table = 'article'
    title = models.CharField(max_length=64)
    headline = models.CharField(max_length=255)
    content = HTMLField()
    image = models.ImageField(upload_to = 'articles/', null=True, blank=True)
    active = models.BooleanField()
    created_at = models.DateTimeField()
    def __unicode__(self):
        return self.title

これはURL構成です:

from django.conf.urls import patterns, include, url
from django.conf import settings
from django.conf.urls.static import static

urlpatterns = patterns('',
# some stuff
) + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

settings.py:

PROJECT_DIR = os.path.dirname(__file__)
MEDIA_ROOT = os.path.join(PROJECT_DIR, "media")
MEDIA_URL = '/media/'

景色:

def slider(request):
    context = Context ({ 'articles': Article.objects.order_by('-created_at')[:5] })
    return render(request, 'articles/slider.html', context)

およびテンプレート:

{% for article in articles %}
  <img src="{{ article.image.url }}" alt="" />

djangoがレンダリングされることを期待しますhttp://127.0.0.1:8000/media/articles/slide-02.jpgが、今はレンダリングされhttp://127.0.0.1:8000/media/slide-02.jpgます。upload_to=articles/モデルクラスでを定義しました。では、なぜarticle.image.url属性はこの重要なディレクトリのないパスを返すのでしょうか?


編集:モデルに問題があります。upload_toディレクトリを認識しません:

$ ./manage.py shell
Python 2.7.3 (default, Aug  1 2012, 05:14:39) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from articles.models import Article
>>> Article.objects.all()
[<Article: Blackened Recordings Launches>, <Article: The Rockin' Return of Deep Purple>, <Article: See Emily Day 20th April>, <Article: Celebration Day Premieres In Four Countries Announced>, <Article: Waging heavy innovation>, <Article: Rush to play festival D'Ete, Quebec City>]
>>> Article.objects.all().get(pk=1)
<Article: Blackened Recordings Launches>
>>> Article.objects.all().get(pk=1).image
<ImageFieldFile: slide-03.jpg>
>>> Article.objects.all().get(pk=1).image.path
u'/var/www/django/djninja/djninja/media/slide-03.jpg'
>>> Article.objects.all().get(pk=1).image.url
'/media/slide-03.jpg'

繰り返しますが、media/articles/slide-03.jpgの代わりになりmedia/slide-03.jpgます。したがって、すべてのルーティング/テンプレートは問題ないと思います。モデルに問題があります。

4

3 に答える 3

2

views.py

from django.shortcuts import render_to_response, RequestContext
def slider(request):
    articles = Article.objects.order_by('-created_at')[:5]
    return render_to_response('articles/slider.html', locals(), context_instance = RequestContext(request)

Slider.htmlの場合

{% for article in articles %}
    <img src="{{ MEDIA_URL }}{{ article.image.url }}" alt="" />
{% endfor %}

urls.pyで:

from django.conf import settings
urlpatterns += patterns('',
    (r'^media/(?P<path>.*)$', 'django.views.static.serve', {'document_root': settings.MEDIA_ROOT}),
)

上記のコードを使用してみてください。

于 2013-03-21T08:42:58.603 に答える
2

上記の解決策は完全に大丈夫です。私の問題は、JSONで記述され、データベースにロードされた不適切に構成されたフィクスチャでした。articlesディレクトリをupload_tokwargとして渡すと、動的にロードされると思いました。そうではありません。これは、画像の保存時にのみ使用され、データベースからの画像の読み込み時には無視されます。したがって、私が持っていた場合

"image":"slide.jpg"

私はそれを次のように変更しました:

"image":"articles/slide.jpg"

そしてそれはうまくいった。実際、それは常に機能していましたが、djangoの公式ドキュメントにそのメモがありません。

于 2013-03-21T12:37:07.833 に答える
1

アップロード方法を使用しようとしましたか?

def upload_path(self, filename):
    return 'media/articles/%s' % filename

class Article(models.Model):
    ...
    image = models.ImageField(upload_to=upload_path, null=True, blank=True)
    ...
于 2013-03-21T08:42:40.233 に答える