我正在努力完成我认为很简单的事情:上传图片(通过管理员),然后使用模板中的完整网址来显示图片。
问题是我只能打印相对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
我错过了什么?感谢。
答案 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})