css中的django变量-我可以使用模板吗

Posted

技术标签:

【中文标题】css中的django变量-我可以使用模板吗【英文标题】:django variables in css - can i use templates 【发布时间】:2012-07-20 10:44:59 【问题描述】:

在我对 django 很陌生之前写了很多 python,并且到目前为止很喜欢它。

我以前的 Web 经验是使用 php,为了使我的 CSS 易于维护,我使用一个 php 文件作为我的 CSS 并将其作为 CSS 内容类型提供。因此,我可以制作可以轻松更改的变量,以使网站中的所有内容都发生变化。

例如样式.php:

<?php header('Content-type: text/css');

$pink = '#91305f';
$green = '#a4ce39';
$black = '#000000';
$white = '#ffffff';
$std_font = "'Ruda', sans-serif";
$std_shadow = "text-shadow: 1px 1px 1px #000;";
$big_shadow = "text-shadow: 2px 2px 2px #000;";
$h_space = '10px';
?>

还有……

html 
    background-color:<?= $pink ?>;
    color: <?= $green ?>;
    font-family: <?= $std_font ?>;

因此,如果我想更改整个站点中黑色的含义,我只需更改顶部的 $black = 以及 CSS 中所有我说过 color: 的地方。会跟进。

我想在 django 中实现相同类型的东西,但不知道该怎么做。我想我可以使用视图在 css 中呈现模板,但不确定如何去做。是否像在我的视图中创建一个 dict 并将其传递给 render_to_response 然后在我的模板文件中引用它一样简单?

例如视图.py:

def style(request):
    colours = 'pink' : '#91305f', 'green' : '#a4ce39'
    return render_to_response('styles.css', 'styles': colours,
                              context_instance=RequestContext(request))

然后,在模板/styles.css 中:

html 
        background-color: styles.pink ;
        color:  styles.green ;
    

这是一个可行的解决方案吗?如果是这样,似乎我将视图与模板耦合,但我无法弄清楚我将在哪里存储实现这一目标所需的数据。

谢谢 亚伦

【问题讨论】:

【参考方案1】:

如果我正确理解您的问题,您希望能够轻松更改整个网站的布局,而无需编辑所有样式表。对我来说,听起来您不想使用内联样式和生成的 css,而是使用 SASS 或 LESS 并使用变量来设计颜色:

http://sass-lang.com/ http://lesscss.org/

【讨论】:

太棒了!谢谢@markijbema。我不知道存在这种东西。鉴于 sass 需要 ruby​​,我做了一个快速的 google,希望将依赖关系保持在最低限度,并发现 python-scss 似乎是 sass 的 python 端口。对此有什么想法/经验吗? link 就我个人而言,我不认为在当前包管理器时代这真的是个问题。使用 rvm/bundler 之类的工具用于 ruby​​,virtualenv/pip 用于 python 和 npm 用于节点,拥有一些额外的环境并不是真正的问题。我个人不知道 python-scss,所以不能就此提出建议(但 scss 是好的版本,它是“新”的 sass) 使用 django-compressor (django_compressor.readthedocs.org/en/latest/index.html) 之类的东西【参考方案2】:

您可以完全按照您说的做,因此从不在静态根目录中的某个地方提供 css,通过 URL 系统传递请求并将文件呈现为页面。但是,对于所有帐户来说,这都是一种非常低效的方法,尤其是当您在每次页面加载时提供多个 CSS 文件时。在这种情况下,您可以做的是设置 Web 服务器以无限期缓存 CSS 文件,并且只根据您的命令进行更新,在这种情况下,您将拥有静态 CSS 文件的所有速度优势和动态 CSS 文件的所有可维护性那些。如果您想为每个用户提供自定义 CSS,那么这种方法将不起作用。您可以做的最后一件事是自己编写一个小解析器,它可以解析您创建的“meta-css”文件,您可以在其中定义大量变量(如 django 模板),然后用您指定的变量替换这些文件并上传结果用作静态文件的 CSS。你当然可以使用 django 引擎来做到这一点,只需请求页面并将生成的文件复制到静态目录,此时它就变成了手动版本的 apache 缓存。

【讨论】:

感谢 TimD,您能否详细说明一下:“设置 Web 服务器以无限期缓存 CSS 文件,并且仅根据您的命令进行更新”。你是对的,它只需要在我决定在整个站点范围内更改颜色时才需要更改,因此不会很频繁,但是当我身后有 python 时,我并不热衷于查找和替换方法! 您最好的选择可能是使用这样的工具:allbuttonspressed.com/projects/django-mediagenerator 我自己从来没有做过,但是 Django 有一个内置的缓存层,见这里:docs.djangoproject.com/en/1.4/topics/cache【参考方案3】:

我不确定这是否是好方法。可能您可以将class 添加到您想要应用特定样式的元素。

无论如何,如果你想继续这个方法,你可以实现你的上下文处理器,它会默认添加这些变量。参考Writing your context processor

【讨论】:

感谢罗汉。我在这些变量中分配的颜色/样式是站点范围的,我这样分配它们的唯一原因是为了避免在我想做一个小的调整时找到并替换它们。因此,我认为为我想要设置样式的每个元素(一切!)添加类对我来说会更有效。另外,我喜欢编写上下文处理器的想法,但是当我只在一个 css 视图中需要它时,默认情况下将 dict 传递给每个模板似乎效率低下。使用这种方法,您能看到哪些我没有看到的优势?

以上是关于css中的django变量-我可以使用模板吗的主要内容,如果未能解决你的问题,请参考以下文章

如果评估的变量为 False,为啥我的 django 模板中的这个 IF 语句会执行?

可以为 Django 中的扩展 html 模板定义一个单独的 css 文件吗?

使用模板变量时,Django 模板不呈现 CSS

javascript中的Django模板值

Django 模板中的动态内联 CSS 样式

如何在Django中访问子模板中的会话变量?