在Django中访问“Media”文件

tgabmvqs  于 2023-05-01  发布在  Go
关注(0)|答案(9)|浏览(180)

我很喜欢Django,但是开发环境中的静态和媒体文件让我抓狂。请把我从愚蠢中解救出来。
我在开发机器上。我在项目目录的根目录下有一个文件夹media
settings.py中,我有:MEDIA_ROOT = ''MEDIA_URL = '/media/'
urls.py中,我有:

if settings.DEBUG:
    urlpatterns += patterns('',
        url(r'^media/(?P<path>.*)$',
            'django.views.static.serve',
            {'document_root': settings.MEDIA_ROOT, }),
    )

但是我可以获得媒体文件的唯一方法是通过引用/media/media/ e。例如<img src="/media/media/image.png" />
我期待(和想要)
<img src="/media/image.png" />
有谁能告诉我这里发生了什么,并给予我一个简单的设置媒体文件处理方法?
非常感谢。
@Timmy O 'Mahony-谢谢!史诗般的文章,非常清晰。但它留下了几个问题:
(1)我必须使用/media//static/,而不是media/static/作为MEDIA_URLSTATIC_URL-我错过了什么吗?
(2)如果collectstatic软管/static/,你把网站级CSS放在哪里?g.网站的CSS文件?显然不是/static/
(3)我把它们放在项目根目录下的'_'目录中,并设置STATICFILES_DIRS指向它--这似乎是开发服务器获取静态文件的地方,尽管有urlpatterns指令。如果这是错误的,你在开发过程中把网站级CSS放在哪里,当你修改它们时,collectstatic的工作流程是什么-你必须在一个地方编辑它们,然后在每次编辑后在其他地方收集它们吗?

mwkjh3gx

mwkjh3gx1#

文件夹设置:

你的项目根应该是这样的:

/app1
/app2
/media
/static
/templates
urls.py
settings.py
manage.py

媒体文件夹应该包含图像,下载和其他可能在网站正常使用期间上传的材料(即。即在开发完成之后)
static文件夹应该保存所有CSS/JS和其他材料,这是网站开发的一部分
设置.py:
MEDIA_ROOT是上述静态文件夹的绝对服务器路径。这意味着它应该是这样的:

MEDIA_ROOT = "/User/Bob/Sites/MySite/Project_root/media/"

MEDIA_URL是您在查看网站时访问媒体文件的相对浏览器URL。应该是(通常)

MEDIA_URL = "media/"

这意味着所有材料都可以在http://example.com/media/处查看
类似地,STATIC_ROOT应该是类似于

STATIC_ROOT = "/User/Bob/Sites/MySite/Project_root/static/"

STATIC_URL

STATIC_URL = "static/"

服务文件:

既然您已经告诉django这些文件夹应该在哪里,以及访问它们的正确URL,那么您需要正确地处理对文件夹的所有请求。
通常,当您在生产环境中时,您希望Web服务器负责提供静态文件和媒体文件。
如果你正在开发,你可以让django开发服务器为你服务。
要做到这一点,您告诉它将所有进入http://example.com/media的请求路由到您的MEDIA_ROOT,并将所有进入http://example.com/static的请求路由到您的STATIC_ROOT。
为此,您可以在www. example中添加一些URL www.example.com 就像你有:

from django.conf import settings
if settings.DEBUG:
    urlpatterns += patterns('',
        url(r'^media/(?P<path>.*)$', 'django.views.static.serve', {
            'document_root': settings.MEDIA_ROOT,
        }),
        url(r'^static/(?P<path>.*)$', 'django.views.static.serve', {
            'document_root': settings.STATIC_ROOT,
        }),
)

额外

如果你有多个应用程序,每个都有自己的CSS和JS文件,你可能不想把它们放在一个单独的/static/文件夹中。将它们放在它们所属的应用的子文件夹中可能会很有用:

/app1/static/ # Specific static folder
/app2/static/
/media/
/static/ # Root static folder

现在,您的Web服务器/开发服务器只在您告诉它要查找的地方查找静态文件(即:因此您需要收集子文件夹中的所有文件并将其复制到根静态文件夹中。你可以手工完成,但是django提供了一个命令(这是静态应用程序的全部意义)

./manage collectstatic
pbossiut

pbossiut2#

为什么将MEDIA_ROOT设置为空?它必须是媒体目录的路径。正如您所说,由于您的媒体位于名为media的子目录中,因此应该将其放入MEDIA_ROOT中。

5ktev3wc

5ktev3wc3#

我按照timmy程序,但我得到了一个错误,没有模块名称django.views。当我在我的virtualenv中使用import django.views时,一切都很好。e这不是导入库的问题。
不过,我能够解决这个问题,按照这个过程在我的主要网址文件

from django.conf.urls.static import  static
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

https://docs.djangoproject.com/en/dev/howto/static-files/

ar5n3qh5

ar5n3qh54#

我也遇到了同样的问题,所以我添加了这些行

from django.conf.urls import url, include
from django.contrib import admin
from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
    url(r'', include('blog.urls')),
    url(r'^admin/', admin.site.urls),
    url(r'^cadmin/', include('cadmin.urls')),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

在Django项目配置目录中的urls.py中。更多信息:https://overiq.com/django/1.10/handling-media-files-in-django/

j2datikz

j2datikz5#

在您的设置中。py,确保添加
django.core. context_ www.example.com
在TEMPLATE_CONTEXT_PROCESSORS中。否则,当您在模板中使用MEDIA_ROOT时,它将无法工作。

kqqjbcuj

kqqjbcuj6#

我正在使用Django 1。10.我的媒体文件夹是'uploads'这是mywww.example中的配置 www.example.com

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

在模板中,我把我的MEDIA_URL的名称放在www.example之前 www.example.com 。url像这样:

<img src="uploads/{{ imagen_identificativa.name }} " alt="{{imagen_identificativa}}">

对我很有效。希望这能帮上忙。

6l7fqoea

6l7fqoea7#

对于Django版本3,我使用了以下内容:

from django.conf import settings
from django.urls import re_path
from django.views.static import serve

# ... the rest of your URLconf goes here ...

if settings.DEBUG:
    urlpatterns += [
        re_path(r'^media/(?P<path>.*)$', serve, {
            'document_root': settings.MEDIA_ROOT,
        }),
    ]

我 www.example.com

BASE_DIR = Path(__file__).resolve().parent.parent
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True
STATIC_URL = '/static/'

这里是一个文档链接https://docs.djangoproject.com/en/3.1/ref/views/如果你在一些开发服务器上使用Django REST,不要忘记更新你的开发代理设置,将/media重定向到Django后端

t40tm48m

t40tm48m8#

下面是另一种选择:
在设置中设置您的媒体配置。py’:

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

假设我有一个名为person的模态,图像文件如下所示:

class Person(models.Model):
    name = models.CharField(max_length = 30)
    photo = models.ImageField(upload_to = 'photos')

现在这里的upload_to路径是在MEDIA_ROOT文件夹中。在我的情况下,将创建一个媒体文件夹内的照片文件夹将被创建,我们的媒体在这里将被倾倒。
所以现在在我的模板中,我做了这样的事情:

<img src="{{ person.photo.url}} />

简而言之,你有一个字段,像这样使用它:

src ={{ object.field.url}}

希望有帮助!编码快乐!

2w3rbyxf

2w3rbyxf9#

我花了半个月的时间来寻找答案。魔术子弹是使用src = {{ object.field.url }}一切似乎都设置正确。我使用Admin功能在根目录下创建了文件夹- media\images\aaa。jpg
我拥有的:
setting.py

MEDIA_URL = "media/"
MEDIA_ROOT = BASE_DIR / "media"

urls.py

urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT )

models.py

image = models.ImageField(null=True,blank=True,upload_to="images/")

html文件

<img src={{quiz.image}} alt="no image found">

将上述内容更改为

<img src={{quiz.image.url}} alt="no image found">

显示图像!!

相关问题