Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Can';是否在my Django应用程序的models.py中使用imageField显示照片?_Python_Django - Fatal编程技术网

Python Can';是否在my Django应用程序的models.py中使用imageField显示照片?

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

在Django PhotoViewer应用程序的my models.py中,我为我的Photo类定义了一个imageField,用于在站点上显示图像。我已经通过Django管理员页面上传了一些照片,但是没有一张显示出来。我确实看到所有这些照片都上传到我的/static/images文件夹中。但是当我转到我的照片索引(照片列表页面):
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重启

如果您看不到页面上的图片:

  • 在源代码中查找url
  • 尝试通过浏览器直接在中打开
  • 检查nginx日志

  • 我希望我的小建议能帮助你度过艰难的生活

    在模板中使用{{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/目录中。我的意图是创建一个个人照片公文包网站,用户上传照片,并将其显示在外部网站上。如果照片最终位于静态目录中,您可以