【问题标题】:How to Find Django ImageField URL如何查找 Django ImageField URL
【发布时间】:2017-03-12 20:17:40
【问题描述】:

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

问题是我只能打印相对 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/'

网址.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 时,我得到了这个部分 URL:

pics/intro-bg.jpg

我错过了什么?谢谢。

【问题讨论】:

标签: python django django-models imagefield


【解决方案1】:

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

网址:

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

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 模型有一个 imagefield,当它被存储时,我可以根据上面的设置通过item.image.url 检索完整的 url。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 更改后仍然只显示相对 URL:pics/filename.jpg
    【解决方案3】:

    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)
    

    这些 URL 模式背后的逻辑会显示我的主页和个别新闻文章。每篇新闻文章都有一个 /news/ 的 url,后跟文章编号,即 /news/1。

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

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

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

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

    【讨论】:

    • 已解决。在我的模板中:
    【解决方案4】:

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

    所以要获取绝对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})
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-16
      • 1970-01-01
      • 2017-07-10
      • 1970-01-01
      • 1970-01-01
      • 2013-03-23
      • 2015-08-13
      • 2021-01-12
      相关资源
      最近更新 更多