2012-07-21 58 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