显示从标签文件或context_processors变量在Django模板

问题描述:

据我了解的其他问题: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

您可以编写自定义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

我发现基于不同的答案的解决方案,我将解释我做了什么。该解决方案适用于我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并验证我的选择时,我的主题选择考虑了新主题和全局背景颜色变化!

我的回答会帮助其他程序员!

感谢所有:)