【问题标题】:Uploaded images not showing, wrong path上传的图片不显示,路径错误
【发布时间】:2013-03-10 06:41:32
【问题描述】:

我在显示从管理面板上传的图像时遇到问题。 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。所以我猜所有路由/模板都可以,模型有问题。

【问题讨论】:

  • 我觉得没问题。也许图像是在您添加upload_to=articles 之前上传的?或者您在添加后忘记在编辑器中点击保存? (对不起,不得不问)。
  • 所有记录都加载了fixtures/syncdb,所以我想应该可以正常工作。
  • 试试/media/{{ article.image }}/

标签: django upload path


【解决方案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)
    ...

【讨论】:

  • 我已经尝试过了,没有任何改变,因为 - 不知何故 - upload_to 被忽略了:/。我查看了 django 源代码,发现FileFieldImageField 都使用Storage 机制。也许有一个约定应该将什么值传递给upload_to kwarg?我不遵守的约定 - 这就是原因?
  • 顺便说一句,如果您的解决方案有效,我最终会在模板中使用/media/media/articles/file.jpg 路径,因为storage.url/storage.path 返回/media/,因为它在@987654331 中配置@.
【解决方案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}),
)

尝试使用上面给出的代码。

【讨论】:

    【解决方案3】:

    以上解决方案完全没问题。我的问题是用 JSON 编写并加载到数据库中的配置不正确的装置。我认为在您将articles 目录作为upload_to kwarg 传递时,它将被动态加载。 不是。它仅在保存图像期间使用,在从数据库加载图像期间被忽略。因此,如果我有

    "image":"slide.jpg"
    

    我改成:

    "image":"articles/slide.jpg"
    

    它奏效了。事实上,它一直有效,但我错过了 django 官方文档中的注释。

    【讨论】:

      猜你喜欢
      • 2020-12-31
      • 1970-01-01
      • 2018-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-30
      • 1970-01-01
      相关资源
      最近更新 更多