【问题标题】:Linking to stylesheet with Django使用 Django 链接到样式表
【发布时间】:2011-08-26 18:17:14
【问题描述】:

我找到了很多关于如何执行此操作的不同示例,它们在设置为 MEDIA_URL、STATIC_URL、MEDIA_ROOT、MEDIA_URL 时都略有不同。我的项目文件结构如下:

myproject/
    images/ (user-uploaded)
    media/ (empty so far)
    settings.py
    static/
        css/
            styles.css
        fonts/
    templates/
        auth/
            base.html
            login.html
        index.html
    urls.py

当然,根文件夹中还有应用程序目录。为了让我的图像显示在索引模板上,我这样做了:

urls.py:

from django.conf import settings

(r'%s(?P<path>.*)' % settings.MEDIA_URL[1:], 'django.views.static.serve', {'document_root': settings.MEDIA_ROOT}),

settings.py(这些是默认设置):

MEDIA_ROOT = ''

MEDIA_URL = ''

STATIC_ROOT = ''

STATIC_URL = '/static/'

ADMIN_MEDIA_PREFIX = '/static/admin/'

我正在制作的网站在前端只有一个页面。如何让样式表正确链接?我不确定所有这些目录设置之间有什么区别,或者为什么我会使用一个而不是另一个... javascript、字体、静态图片、用户上传的图片等

【问题讨论】:

    标签: django


    【解决方案1】:

    在 Django 1.3 之前的版本中,只有两个设置很重要:

    MEDIA_ROOT:媒体文件的绝对文件系统路径

    MEDIA_URL:媒体文件的绝对 URL,带或不带域

    在 Django 1.3 之后,引入了 staticfiles contrib 包,这对于第一次来说是相当混乱的。您需要以下设置:

    MEDIA_ROOT:用户上传的绝对文件系统路径

    MEDIA_URL:用户上传的绝对 URL,带或不带域

    STATIC_ROOT :静态文件目录的绝对文件系统路径。 这是collectstatic 管理命令使用的文件夹。 不要在此处手动放置任何文件。

    STATIC_URL :静态文件目录的绝对 URL,带有或 没有域名

    然后,为您的每个应用创建一个“静态”目录,this 就是您的静态文件所在的位置。在开发中,Django 会自动在STATIC_URL 下提供这些文件。在生产中,您必须运行collectstatic 管理命令将它们全部移动到项目的“静态”目录,然后是STATIC_URL 下的服务器。

    这一切都很好,但您可能会注意到这并不能真正涵盖所有内容。总是有项目范围的静态文件不一定属于一个应用程序或另一个,但默认的静态文件设置并没有给您任何放置这些文件的地方。因此,您可以通过附加设置自行处理:

    STATICFILES_DIRS = (
        "/absolute/path/to/myproject/assets/",
    )
    

    在这里,我使用了一个名为“assets”的目录,用于存放项目范围的静态文件。目录名称可以随意命名,但不能与STATIC_ROOT相同。

    最后一点让人绊倒的是为管理媒体提供服务。您所要做的就是包括设置:

    ADMIN_MEDIA_PREFIX = STATIC_URL+'admin/'
    

    【讨论】:

      【解决方案2】:

      媒体用于用户上传的文件,静态 - 用于您的 CSS 和其他文件,因此您必须为您的静态文件(如 js 和 css)创建目录。

      你做对了所有事情,因为在 Django 的官方文档中有类似的内容。我将按照朋友告诉我的方式,在几台机器上提供静态文件:

      # settings.py
      PROJECT_DIR = os.path.dirname(os.path.abspath(__file__))
      sys.path.insert(0, os.path.join(PROJECT_DIR, 'models'))
      PROJECT_URL = 'http://127.0.0.1:8000'
      
      MEDIA_ROOT = os.path.join(PROJECT_DIR, 'media')
      
      MEDIA_URL = PROJECT_URL + '/media/'
      
      STATIC_ROOT = os.path.join(PROJECT_DIR, 'static')
      
      STATIC_URL = PROJECT_URL + '/static/'
      
      ADMIN_MEDIA_PREFIX = PROJECT_URL + '/static/admin/'
      
      # Additional locations of static files
      STATICFILES_DIRS = (
          os.path.join(PROJECT_DIR, 'static'),
          os.path.join(PROJECT_DIR, 'media'),
      )
      # urls.py
      urlpatterns += patterns('',
              (r'^media/(?P<path>.*)$', 'django.views.static.serve',{'document_root': settings.MEDIA_ROOT}),
              (r'^static/(?P<path>.*)$', 'django.views.static.serve',{'document_root': settings.STATIC_ROOT}),
      )
      

      【讨论】:

      • 您甚至不需要 MEDIA_URLSTATIC_URL 的完整 URL 路径,只需使用“/media/”和“/static/”即可。不过,使用 os 绝对是最好的方法。
      • 好的,没关系...不太了解 Python,但在顶部添加 import os, sys 修复了它。但是,对于现场部署站点来说,这意味着什么?这些都会被破坏吗?
      • 是的,它是 Python 模块。至于这段代码——它将允许你在每台计算机上以开发模式运行你的项目,而无需重新定义静态目录——它将通过 Python 函数发现 Windows 或 Linux 中的路径。
      • 它将在现场项目中工作。这段代码来自我的网站,我在 Windows 中开发它,现在它在 Linux (Ubuntu) 上运行,我只需将 PROJECT_URL 更改为现有域即可使其运行。但这是“不好”的方式,您的服务器必须在实时项目中为您提供静态文件,无论如何这也可以正常工作。由于我不擅长管理 - 我使用这种方法。
      • @Art ...除了现在我的 127.0.0.1:8000/admin 样式不再链接。我该如何解决?
      猜你喜欢
      • 1970-01-01
      • 2020-06-06
      • 2012-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-05
      相关资源
      最近更新 更多