如何查找Django ImageField URL

时间:2017-03-12 20:17:40

标签: python django django-models imagefield

我正在努力完成我认为很简单的事情:上传图片(通过管理员),然后使用模板中的完整网址来显示图片。

问题是我只能打印相对URL:/pics/filename.jpg。我相信序列是settings.py(MEDIA_ROOT,MEDIA_URL),urls.py,views.py然后是mytemplate.html。我希望有人能找到遗漏的内容。

Settings:
 STATIC_URL = '/static/'
 MEDIA_ROOT = '/Users/ed/code/projects/djcms/pics/'
 MEDIA_URL = '/pics/'

Urls.py:

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

from . import views

urlpatterns = [
url(r'^$', views.index, name='index'),
url(r'^news/(?P<pk>[0-9]+)/$', views.detail, name='detail'),
] + static(r'^$/pics/', document_root = settings.MEDIA_URL)

Views.py

def detail(request, pk):
    story = Article.objects.get(pk=pk)
    my_pic = Photo.objects.get(pk=pk)
    print(story.image.url)
    print(my_pic)
    print(story.body)


    print(request)
    context = {'story': story}
    return render(request, 'articles/detail.html', context)

story.image.url的错误:

AttributeError: 'Photo' object has no attribute 'url'

当我删除.url时,我会得到这个部分网址:

pics/intro-bg.jpg

我错过了什么?感谢。

4 个答案:

答案 0 :(得分:0)

在urls.py中,尝试:static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

答案 1 :(得分:0)

此设置对我有用,也许它会对您有所帮助。它是最新版本的Django。操作系统中的许多答案都适用于较旧的Django版本。

URLS:

urlpatterns = [
#url
]+ static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

设定:

MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'

模板:

<img src="{{ foo.image.url }}"><br>

型号:

image = models.ImageField(upload_to = 'img/', default = 'img/None/no-img.jpg')

我的foo模型有一个图像字段,当存储时,我可以根据上述设置通过item.image.url检索完整的网址。

答案 2 :(得分:0)

URLS似乎导致了问题。

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

from . import views

urlpatterns = [
url(r'^$', views.index, name='index'),
url(r'^news/(?P<pk>[0-9]+)/$', views.detail, name='detail'),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

这些网址格式背后的逻辑显示了我的主页和个人新闻文章。每篇新闻文章的网址为/ news /,后跟文章编号,即/ news / 1。

每篇文章都通过Article模型中的ForeignKey使用我的Photo模型。这允许将照片绑定到特定文章。

但是,在我的模板中,网址是一堆新闻和图片:

http://localhost:8000/news/2/img/phones.png. 

新闻网址正确查找新闻项目,但不能找到与新闻项目相关联的图像。正确的结果将显示单个文章及其相关图像。我需要其他网址吗?

答案 3 :(得分:0)

Django中的Request对象有一个方法build_absolute_uri(),使用此方法可以获得图像字段的绝对URL。

因此,要获取绝对网址,可以使用两种方法

第一种方法:在执行GET请求时在视图中获取绝对URL。

from settings import MEDIA_URL

class ClassName(APIView):

    def get(self, *args, **kwargs):
        model = models.ModelName.objects.get(name='pran')
        absolute_url = self.request.build_absolute_uri('/').strip("/") + MEDIA_URL + str(model.image_field_name)
        return Response({'url': absolute_url}, 200)

方法2:如果您正在执行POST请求,并且正在使用序列化程序,则将请求作为上下文对象传递给它。

ser = serializers.MySerializerName(data=request.data}, context={'request': request})