【问题标题】:Displaying variable from tags file or context_processors in Django Template在 Django 模板中显示来自标签文件或 context_processors 的变量
【发布时间】:2017-07-12 18:24:10
【问题描述】:

根据我的其他问题: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 在我之前的帖子中的慷慨,我没有找到解决方案。

也许有人有索引或想法?

谢谢

【问题讨论】:

  • 对不起,如果这是个愚蠢的问题,但不是做自定义标签,为什么不将mytheme 添加到视图中的模板上下文中?像这样context['mytheme']=Theme.objects.values_list('favorite_theme').last()。此外,如果每个用户都有自己的主题,你不应该只为当前用户过滤主题:` Theme.objects.filter(user=request.user).values_list('favorite_theme').last()`
  • 这根本不是一个愚蠢的问题!这个主题必须在我的 django 网站的任何地方应用。所选主题更改背景颜色,... 在所有 html 模板页面上。只有管​​理员(也就是说我)可以通过检查 RadioSelectBox 来更改主题。如果我将mytheme 放在视图中,我必须在所有视图(大约 10 个应用程序)和每个功能中都这样做吗?这就是为什么标签文件似乎是一个更好的主意,但我会犯错误^^
  • 好吧,尝试解决一些问题。首先从GetTheme 中删除参数以避免覆盖Theme 名称:def GetTheme():。其次在模板中分配mytheme变量:{% GetTheme as mytheme %},然后再使用它。
  • 我收到了Invalid block tag on line 8: 'GetTheme'. Did you forget to register or load this tag? for {% GetTheme as mytheme %}
  • 可能你没有加载 tag.py 你需要这样做{% load tags %} 其中tags 是模块文件的名称。添加新模板标签后,您还需要重新启动服务器。

标签: python html django


【解决方案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',
        ],
    },
  },
]

上下文处理器.py

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

【讨论】:

  • 我按照你的例子和这个链接:stackoverflow.com/questions/32828536/…。但是 CSS 样式表没有出现..
  • {{mytheme}} 在模板上打印为red吗?
  • 我根据您的回答和一些文档找到了解决方案。我会写一个完整的答案来做到这一点;)谢谢
【解决方案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应用修改我的Base.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 文件。

从现在开始,当我用两个主题之间的选择填充公式:数据系统和喀麦隆并验证我的选择时,会考虑新主题,并且由于我的主题选择而导致全局背景颜色发生变化!

希望我的回答能帮助其他程序员!

谢谢大家:)

【讨论】:

    猜你喜欢
    • 2017-03-19
    • 1970-01-01
    • 2014-06-25
    • 2018-09-06
    • 1970-01-01
    • 2018-09-03
    • 2021-02-15
    • 2021-06-02
    相关资源
    最近更新 更多