2012-07-21 45 views
2

在我对django比较陌生并且非常喜欢它之前,写了很多python。css中的django变量 - 我可以使用模板

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

例如styles.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 ?>; 
} 

所以如果我想改变我的整个网站黑手段,我只是改变$黑=顶部,并在所有地方我说过的CSS颜色:;将遵循。

我想在django中实现相同类型的东西,但无法弄清楚如何去做。我想我可以使用视图来呈现在CSS模板,但不知道如何去做这件事。是否像在我的视图中创建字典一样简单,然后将它传递给render_to_response,然后在模板文件中引用它?

例如views.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以下,使用变量来设计颜色:

+0

太棒了!感谢@markijbema。我不知道这些事情存在。鉴于sass equires ruby​​,我做了一个快速谷歌,希望将依赖关系保持在最低限度,并且发现python-scss似乎是一个sass的python端口。任何想法/经验? [link](http://packages.python.org/scss/) – Alpaus 2012-07-21 11:49:57

+0

个人而言,我不认为在当前的包管理者时代,这确实是一个问题。使用诸如rvm/bundler for ruby​​,virtualenv/pip for python和npm for node等具有一些额外环境的工具并不是真正的问题。我个人不知道python-scss,所以不能建议(但scss是好的版本,它是'新'sass) – markijbema 2012-07-21 11:57:38

+0

使用类似django-compressor(http://django_compressor.readthedocs.org/en/最新/ index.html的) – 2012-07-21 16:42:08

0

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

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

+0

感谢Rohan。我在这些变量中分配的颜色/样式是站点范围的,我这样分配它们的唯一原因是为了避免在我想做一个小小的调整时找到并替换它们。因此,我认为将类添加到每个我想要样式的元素(所有东西!)对我来说都是更多的工作。另外,我喜欢编写上下文处理器的想法,但当我只需要在一个css视图中时,默认情况下将dict传递给每个模板似乎效率低下。使用这种方法我看不到什么好处? – Alpaus 2012-07-21 11:30:08

1

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

+0

感谢TimD,你能否详细说明一下:“设置web服务器来无限期地缓存CSS文件,并且只根据你的命令更新”。你是对的,当我决定改变网站的颜色时,它只需要改变,所以它不会很频繁,但是当我有python在我身后时,我并不热衷于查找和替换的方法! – Alpaus 2012-07-21 11:28:34

+0

你最好的选择可能会使用像这样的工具:http://www.allbuttonspressed.com/projects/django-mediagenerator – markijbema 2012-07-21 11:55:36

+0

我从来没有做过,但Django有一个内置的缓存层,看到这里:https: //docs.djangoproject.com/en/1.4/topics/cache/ – TimD 2012-07-21 12:06:18

相关问题