【发布时间】: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是模块文件的名称。添加新模板标签后,您还需要重新启动服务器。