在Django Template中显示标签文件或context_processors中的变量

时间:2017-02-22 15:40:56

标签: python html django

根据我的另一个问题:Handle dynamic staticfiles path with 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那里获得了解决方案。

也许有人有指数或想法?

谢谢

2 个答案:

答案 0 :(得分:2)

我找到了基于不同答案的解决方案,我将解释我所做的事情。此解决方案适用于Django 1.10

第一步:修改settings.py文件

我修改了我的settings.py文件,更准确地说是TEMPLATES PART。目前,此修改仅适用于Accueil Application,但我会将此过程扩展到所有应用程序:

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")}

第三步:修改我的Base.html for Accueil应用程序

我有一个管理我的Accueil应用程序的基本模板。我必须写这样的标题是我想要考虑context_processors变量:

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

通过这种方式,我可以从Theme表中选取最后一行,并将变量放在{{ mytheme }}中。然后,我创建了我的好主题网址。现在,Django将搜索好的存储库中的所有css文件。

从现在开始,当我在处方集中填写两个主题之间的选择:Datasystems和Cameroun并验证我的选择时,新主题会被考虑,并且由于我的主题选择而导致全局背景颜色发生变化!

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

谢谢大家:)

答案 1 :(得分: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'}