Python Can';是否在my Django应用程序的models.py中使用imageField显示照片?
在Django PhotoViewer应用程序的my models.py中,我为我的Photo类定义了一个imageField,用于在站点上显示图像。我已经通过Django管理员页面上传了一些照片,但是没有一张显示出来。我确实看到所有这些照片都上传到我的/static/images文件夹中。但是当我转到我的照片索引(照片列表页面):Python Can';是否在my Django应用程序的models.py中使用imageField显示照片?,python,django,Python,Django,在Django PhotoViewer应用程序的my models.py中,我为我的Photo类定义了一个imageField,用于在站点上显示图像。我已经通过Django管理员页面上传了一些照片,但是没有一张显示出来。我确实看到所有这些照片都上传到我的/static/images文件夹中。但是当我转到我的照片索引(照片列表页面):127.0.0.1:8000:photoViewer/photos,我会看到下面的页面: models.py: from django.db import mode
127.0.0.1:8000:photoViewer/photos
,我会看到下面的页面:
models.py
:
from django.db import models
#photoViewer/: (index) photostream (list all photos)
class Photo (models.Model):
photo_title = models.CharField(max_length=200)
#how to retrieve from metadata of file?
date_taken = models.DateField('date taken', default=None, blank=True, null=True)
photo_img = models.ImageField(upload_to = "images/", default= "")
def __str__(self): # __unicode__ on Python 2
return self.photo_title
photoViewer/url.py
from django.conf.urls import patterns, url
from photoViewer import views
urlpatterns = patterns('',
# "photoViewer/photos"
url(r'^photos/$', views.IndexView.as_view(), name='index'),
# "photoViewer/photos/5/"
url(r'^photos/(?P<pk>\d+)/$', views.DetailView.as_view(), name='detail'),
# "photoViewer/albums/"
# Display list of albums
url(r'^albums/$', views.AlbumsIndexView.as_view(), name='albumsIndex'),
# "photoViewer/albums/1"
# Display photos for a given album
url(r'^albums/(?P<pk>\d+)/$', views.AlbumDetailView.as_view(), name='albumDetail'),
url(r'^test/$', views.TemplateTestView.as_view(), name='templateTest'),
)
我已经安装了最新版本的
枕头
,无论何时使用模型对象显示图像,都需要使用对象.photo\u img.url
访问图像路径。但在此之前,请确保photo_img不包含空字符串
[已编辑]
除非向Django文档中提到的url.py条目添加静态url,否则开发服务器将不会提供图像
urlpatterns = patterns('',
# ... the rest of your URLconf goes here ...
)
urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
urlpatterns += static(settings.MEDIA_ROOT, document_root=settings.MEDIA_ROOT)
参考:首先,您应该注意静态文件和媒体文件是两种不同的东西。静态文件随应用程序一起部署,用于静态内容(css、js、用于设置站点样式的图像)。媒体文件上载到模型等中使用的文件 下一件事:默认情况下,django开发服务器不提供媒体文件。所以你应该为他们服务 对于显示图像,您应该在以下模板代码中使用:
<img src="{{ photo.photo_img.url }}" alt={{ photo.photo_title }}>
# settings.py
import os
SITE_ROOT = os.path.dirname(os.path.realpath(__file__))
STATIC_ROOT = os.path.join(SITE_ROOT, 'static')
MEDIA_ROOT = os.path.join(SITE_ROOT, 'static')
您不必(也不应该)自己为静态或媒体文件添加前缀,django将根据您的设置中的
static\u URL
和media\u URL
来处理它。我总是这样配置我的开发环境:
<img src="{{ photo.photo_img.url }}" alt={{ photo.photo_title }}>
# settings.py
import os
SITE_ROOT = os.path.dirname(os.path.realpath(__file__))
STATIC_ROOT = os.path.join(SITE_ROOT, 'static')
MEDIA_ROOT = os.path.join(SITE_ROOT, 'static')
Django-用于处理请求,nginx-用于服务静态和媒体
此外,我建议您为您的开发站点设置域
您需要如下设置静态根目录和媒体根目录:
<img src="{{ photo.photo_img.url }}" alt={{ photo.photo_title }}>
# settings.py
import os
SITE_ROOT = os.path.dirname(os.path.realpath(__file__))
STATIC_ROOT = os.path.join(SITE_ROOT, 'static')
MEDIA_ROOT = os.path.join(SITE_ROOT, 'static')
注意:不要将静态文件放入静态根目录中!在每个应用程序内创建静态文件夹,然后使用命令。它将检查所有已安装的应用程序,并将所有静态数据从它复制到静态根目录。但您需要在添加或编辑某些文件后运行此命令。如果您想经常编辑它们(对于js和css文件),只需对collectstatic命令使用“-l”选项,它将创建链接而不是副本
你应该这么做吗默认的django开发服务器一次只能处理一个请求。例如:如果页面上有10个文件,且一个文件请求时间为200ms,则加载一个页面所需的时间约为2000ms。
Nginx一次可以处理任意数量的请求-总页面加载时间约为200ms。当你在重新加载页面的时候连眨眼都不眨眼的时候,这真是太好了。另一个好处是,您不会在django请求日志中看到任何无用的请求
通过上面显示的设置,django将自动将文件上载到MEDIA_ROOT
Nginx的安装很简单:sudo apt get install Nginx
nginx配置示例:
server {
listen 80;
server_name myserver.com; #you can set any domain name you like in /etc/hosts
#just add line 127.0.0.1 myserver.com into it
access_log /var/logs/nginx/myserver.log;
error_log /var/logs/nginx/myserver.log;
location / {
proxy_pass http://127.0.0.1;
}
location /static {
autoindex off;
alias /var/www/myserver/static/; # put here path to you static root
if ($query_string) {
expires max;
}
}
location /media {
alias /var/www/myserver/media/; # put here path to you media root
# if asset versioning is used
if ($query_string) {
expires max;
}
}
if ($host ~* www\.(.*)) {
set $host_without_www $1;
rewrite ^(.*)$ http://$host_without_www$1 permanent;
}
}
将nginx配置置于:/etc/nginx/sites enabled/you\u file\u name
之后,别忘了重新加载nginx配置
sudo nginx-t#检查配置
sudo服务nginx重新加载
sudo服务ngixn重启
如果您看不到页面上的图片:
我希望我的小建议能帮助你度过艰难的生活 在模板中使用{{STATIC_URL}},而不是硬编码“/STATIC/”
设置STATIC\u ROOT以在开发和服务器环境中正确地为静态文件提供服务。尝试此操作并在设置中进行更改。py
STATIC_URL = '/static/'
MEDIA_ROOT = '/home/subhanshu/mysite/static/' #put the absolute path
MEDIA_URL = '/home/subhanshu/mysite/static/' #put the absolute path
STATICFILES_DIRS = (
os.path.join(BASE_DIR, "static"),
)
并对模板进行如下更改:
{% for CLASSNAME in Object %}
<img src="/static/{{CLASSNAME.CLASS_OBJECT}}" />
{% endfor %}
<img src="{% static 'img/example.jpg' %}">
{%对象%中的类名}
{%endfor%}
如果您想显示一些静态图像,可以使用以下命令:
{% for CLASSNAME in Object %}
<img src="/static/{{CLASSNAME.CLASS_OBJECT}}" />
{% endfor %}
<img src="{% static 'img/example.jpg' %}">
您的视图是什么样子的?您的浏览器试图加载的url是什么?它是否返回404、401或其他内容?需要查看模板以及如何访问那里的图像字段。刚刚更新了我的问题,以包括url.py、views.py和模板文件404控制台输出在网络选项卡中的外观如何?您的媒体URL设置是什么?在管理站点,在模型的更改形式中,您可以单击链接并在浏览器中查看图像吗?我已经将img src从“/static/{{photo.photo\u img}”更改为“/media/{{photo.photo\u img}”,现在它正在工作!我注意到在管理站点中,照片链接指向,而不是我所认为的/static。您通过管理员上传的所有照片是否都以/media而不是/static结尾?那么你如何将图片放入/静态和访问/静态媒体?你能详细说明吗?我刚刚在原来的问题中添加了更多的文件信息。我们把“object.photo\u img.url”放在哪里?我尝试用object.photo\u img.url和photo.photo\u img.url替换“photo\u detail.html”中的src标记值。但是仍然没有图像显示Photo_img包含“images/mountain_wallpaps.jpg”,并且是图像在我的静态文件夹中的正确路径请注意,静态文件和媒体文件不同,并且维护方式也不同。我认为您还没有为您的开发服务器添加任何URL。请看看这个。您需要为静态根目录和媒体根目录添加2个URL OK,所以我已经完成了您发布的内容。当我在“templates/photoViewer/photo_detail.html”页面中硬编码一个图像url时,它正确地显示了图像:但当我引用photo.photo_img字段时,它无法再次正确显示图像。我也试过了,photo.photo\u img.url,同样的东西我用admin上传了一些.jpeg图像,它们都在我的static/目录中。我的意图是创建一个个人照片公文包网站,用户上传照片,并将其显示在外部网站上。如果照片最终位于静态目录中,您可以