2017-02-22 47 views
0

據我瞭解的其他問題:Handle dynamic staticfiles path with Django顯示從標籤文件或context_processors變量在Django模板

我沒有找到解決我的問題的方式。我想在我的HTML模板中插入一個對應於Django查詢的變量。

我已經使用標籤爲了允許取決於用戶組的一些部分。

我tags.py文件看起來像:

from django import template 
from django.contrib.auth.models import Group 
from Configurations.models import Theme 

register = template.Library() 

@register.filter(name='has_group') 
def has_group(user, group_name): 
    group = Group.objects.get(name=group_name) 
    return group in user.groups.all() 

@register.assignment_tag 
def GetTheme(Theme): 

    mytheme = Theme.objects.values_list('favorite_theme').last() 
    return mytheme 

而我的HTML模板的樣子:

<!DOCTYPE html> 
<html> 
    <head> 

    {% load staticfiles %} 
    {% load static %} 
    {% load user_tags %} 

    <title> DatasystemsEC - Accueil </title> 
    <meta charset="utf-8"> 
    <meta name="viewport" content="width=device-width, initial-scale=1"> 
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css"> 
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script> 
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script> 
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 

    <link rel="stylesheet" type="text/css" href="{% get_static_prefix %}{{ mytheme }}/css/Base_Accueil.css"/> 

的目標是在我的tags.py文件,插入拿起變量mytheme它在我的html模板中。

作爲回報,我越來越所有的時間:

#Look double // in my url 
http://localhost:8000/static//css/Base_Accueil.html 

#I should get 
http://localhost:8000/static/{{ mytheme }}/css/Base_Accueil.html 

但是,很長一段時間後,搜索的解決方案,並與來自@DanielRoseman在我以前的帖子的慷慨,我沒有找到解。

也許有人有索引或想法?

謝謝

+0

很抱歉,如果這是愚蠢的問題,但是在做自定義標籤,爲什麼你不加'mytheme'在視圖模板背景?像這樣的'context ['mytheme'] = Theme.objects.values_list('favorite_theme')。last()'。此外,如果每個用戶都有自己的主題,那麼不應該爲當前用戶過濾主題:'Theme.objects.filter(user = request.user).values_list('favorite_theme')。last()' – neverwalkaloner

+0

它根本不是愚蠢的問題 !主題必須在我的django網站的任何地方應用。所選主題在所有html模板頁面上更改背景色...。只有管​​理員(就是說我)可以通過檢查RadioSelectBox來更改主題。如果我把'mytheme'放在視圖中,我必須在所有視圖(大約10個應用程序)中和每個功能上做到這一點?這就是爲什麼標籤文件似乎是一個更好的主意,但我可以犯一個錯誤^^ – Deadpool

+1

好吧,試着修復幾件事情。首先從'GetTheme'中移除參數以避免重寫'Theme' name:'def GetTheme():'。然後在使用之前,在模板中分配'mytheme'變量:'{GetTheme as mytheme%}'。 – neverwalkaloner

回答

1

您可以編寫自定義context_processors

settings.py

TEMPLATES = [ 
    { 
    'BACKEND': 'django.template.backends.django.DjangoTemplates', 
    'DIRS': [os.path.join(BASE_DIR, 'web', 'templates'),], 
    'APP_DIRS': True, 
    'OPTIONS': { 
     'context_processors': [ 
      'django.template.context_processors.debug', 
      'django.template.context_processors.request', 
      'django.contrib.auth.context_processors.auth', 
      'django.core.context_processors.media', 
      'django.core.context_processors.static', 
      'django.contrib.messages.context_processors.messages', 
      'myapp.contextprocessor.mytheme', 
     ], 
    }, 
    }, 
] 

contextprocessor.py

def mytheme(request): 
    return {'mytheme': 'red'} 
+0

我遵循你的例子和這個鏈接:http://stackoverflow.com/questions/32828536/django-no-module-named-context-processors-error-after-reboot。但是CSS樣式表沒有出現.. – Deadpool

+0

'{{mytheme}}'是否在模板上打印爲'red'? –

+0

我根據您的答案和一些文檔找到了解決方案。我會寫一個完整的答案來做到這一點;)謝謝 – Deadpool

2

我發現基於不同的答案的解決方案,我將解釋我做了什麼。該解決方案適用於我Django 1.10

第一步:修改settings.py文件

我修改settings.py文件,更精確TEMPLATES PART。就目前而言,這種修改只是針對ACCUEIL應用程序,但我將這個過程擴展到所有的應用程序:

TEMPLATES = [ 
    { 
     'BACKEND': 'django.template.backends.django.DjangoTemplates', 
     'DIRS': [os.path.join(BASE_DIR, 'templates')], 
     'APP_DIRS': True, 
     'OPTIONS': { 
      'debug' : DEBUG, 
      'context_processors': [ 
       'django.template.context_processors.debug', 
       'django.template.context_processors.request', 
       'django.contrib.auth.context_processors.auth', 
       'django.contrib.messages.context_processors.messages', 
       'myapp.context_processors.context_processors_name_function'], 
     }, 
    }, 
] 

用下面的例子中,最後一行將被寫成這樣:

# 'myapp.context_processors.context_processors_name_function' 
'Accueil.context_processors.GetTheme' 

第二步:在我的應用程序中創建context_processors.py文件

我在我的應用程序部分創建了這個新文件。如上所述,它會擴展到其他應用程序:

from django.conf import settings 
from Configurations.models import Theme 

def GetTheme(request): 
    return {'mytheme' : Theme.objects.values_list('favorite_theme').last()[0].encode("ascii")} 

第三步:修改我的基地。Accueil應用程序的HTML

我有一個基本模板管理我的Accueil應用程序。我有寫頭這樣就是我要考慮到context_processors變量:

{% load static %} 
<link rel="stylesheet" type="text/css" href="{% get_static_prefix %}{{ mytheme }}/css/Base_Accueil.css"/> 

通過這種方式,我可以從我Theme表拿起最後一排,把變量{{ mytheme }}。然後,我創建了我的好主題網址。現在,Django將搜索良好存儲庫中的所有css文件。

從現在開始,當我在兩個主題之間選擇數據系統和Cameroun並驗證我的選擇時,我的主題選擇考慮了新主題和全局背景顏色變化!

我的回答會幫助其他程序員!

感謝所有:)