我想要一个自定义的菜单,取决于您所属的组.我使用Django 1.10.1,allauth等.当我试图制作我的模板标签失败时,它说:¨
TemplateSyntaxError at /
'my_templatetag' is not a registered tag library. Must be one of:
account
account_tags
admin_list
admin_modify
admin_static
admin_urls
cache
i18n
l10n
log
socialaccount
socialaccount_tags
static
staticfiles
tz
Run Code Online (Sandbox Code Playgroud)
'my_templatetag.py'看起来像这样:
from django import template
from django.contrib.auth.models import Group
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()
Run Code Online (Sandbox Code Playgroud)
和我的.html文件中出现错误,说,
{% load my_templatetag %}
Run Code Online (Sandbox Code Playgroud)
我试图重启服务器数百万次,我也尝试更改所有名称,该应用程序是settings.py中的INSTALLED_APPS的一部分.我究竟做错了什么?
我已经创建了一个我想要使用的自定义标签,但是Django似乎无法找到它.我的templatetags目录设置如下:
pygmentize.py
from pygments import highlight
from pygments.lexers import get_lexer_by_name
from django import template
from pygments.formatters.other import NullFormatter
register = template.Library()
@register.tag(name='code')
def do_code(parser,token):
code = token.split_contents()[-1]
nodelist = parser.parse(('endcode',))
parser.delete_first_token()
return CodeNode(code,nodelist)
class CodeNode(template.Node):
def __init__(self,lang,code):
self.lang = lang
self.nodelist = code
def render(self,context):
code = self.nodelist.render(context)
lexer = get_lexer_by_name('python')
return highlight(code,lexer,NullFormatter())
Run Code Online (Sandbox Code Playgroud)
我正在尝试使用此标记来呈现代码gameprofile.html.
gameprofile.html
(% load pygmentize %}
{% block content %}
<title>{% block title %} | {{ game.title }}{% endblock %}</title>
<div id="gamecodecontainer">
{% …Run Code Online (Sandbox Code Playgroud) 如果我从命令行启动python并输入:
import random
print "Random: " + str(random.random())
Run Code Online (Sandbox Code Playgroud)
它打印出一个随机数(预期,优秀).
如果我在我的django应用程序的models.py中包含上面两行,并使用runserver启动我的django应用程序,我在命令行上输出显示一个随机数(太棒了!)
如果我采用自定义标签,否则完全正常,但我包括
import random
print "Random: " + str(random.random())
Run Code Online (Sandbox Code Playgroud)
作为自定义标记的.py文件的前两行,每当我尝试打开使用该自定义标记的模板时,我都会收到错误:
TypeError at /help/
'module' object is not callable
Run Code Online (Sandbox Code Playgroud)
请记住,如果我摆脱这两行,我的自定义标记的行为与预期的一样,并且不会抛出任何错误.不幸的是,我需要在模板标签内部进行一些随机行为.
问题是如果在自定义标签中我做:
import random
Run Code Online (Sandbox Code Playgroud)
在自定义模板标签上,它导入
<module 'django.templatetags.random' from '[snip path]'>
Run Code Online (Sandbox Code Playgroud)
并不是
<module 'random' from 'C:\\Program Files\\Python26\\lib\\random.pyc'>
Run Code Online (Sandbox Code Playgroud)
通常从其他地方进口
Django模板库有一个名为random的过滤器,不知怎样,它优先于系统的随机性.
任何人都可以推荐如何显式导入适当的python随机?
我是Django的新手,我正在尝试将上传文件表单放入包含标记中.所以我可以在各种模板中使用它.
我创建了以下包含标记:
#upload_files.py
@register.inclusion_tag('upload_form.html')
def upload_handler(context):
request = context['request']
view_url = reverse('upload.views.upload_handler')
if request.method == 'POST':
form = UploadForm(request.POST, request.FILES)
if form.is_valid():
form.save()
return HttpResponseRedirect(view_url)
upload_url, upload_data = prepare_upload(request, view_url)
form = UploadForm()
upload_model_list = UploadModel.objects.all().order_by('-pub_date')
我现在希望将其包含在模板中,所以在我拥有的页面上:
#mypage.html
{% extends 'base.html' %}
{% load upload_files %}
{% upload_handler %}
我收到以下错误:
upload_handler takes 1 arguments
我应该从模板中传递什么参数?
问题是,如果我将一个模板标签调用到一个块中并且它填充了我通常的上下文[varname] =某个变量,那么如果我需要将该变量放入另一个块,我必须再次调用templatetag.这对我来说意味着额外的数据库查询,这是我想要避免的.
这个模板标签在一个基本模板中调用,该模板由许多其他模板扩展,因此我不能只改变所有视图以将某些内容传递给上下文,这没有意义(WET原理?)
即使是上下文处理器也不好,因为我不想为站点中呈现的每个页面调用它,即使是那些不基于该模板的页面.
我正在考虑编写一个模板标签,它将使用内部上下文结构将变量放在全局上下文中,但我觉得这样做太内疚了.
你会如何解决这个问题?
我们的Django站点使用Mako模板构建.我们想使用名为django-socialregistration的第三方项目,但其模板标签使用Django的模板.如果我们使用Django模板,我们就可以
{% load facebook_tags %}
{% facebook_button %}
{% facebook_js %}
Run Code Online (Sandbox Code Playgroud)
我怎么能在Mako做同样的事情?你可以在Mako中内联蟒蛇,但我还没弄明白怎么做.
最终修复
<%! from django.template import Template, Context %>
<% tpl = "{% load facebook_tags %}{% facebook_button %}{% facebook_js %}" %>
${Template(tpl).render(Context(dict_=dict(request=request)))}
Run Code Online (Sandbox Code Playgroud) 我试着在模板中显示一个枚举的名称.要清楚,我有类似的课程 model.py
class EmployerWorkerNumberRange():
R_0 = 0
R_1_5 = 1
R_6_15 = 2
UNKNOWN = 3
EMPLOYER_WORKER_NUMBER_RANGE =(
(R_0,_("wnr_0")),
(R_1_5 ,_("wnr_1_5")),
(R_6_15,_("wnr_6_15")),
(UNKNOWN,_("UnknownWorkerNumberRange")),
)
Run Code Online (Sandbox Code Playgroud)
当我在形式上使用它时
wnr = forms.ChoiceField(label=_("emp_full_reg_wnr"), required=True, choices=EmployerWorkerNumberRange.EMPLOYER_WORKER_NUMBER_RANGE)
它工作得很好.(用翻译的值填充下拉列表,当我得到所选项目时,它只会转换为id)
我的问题是如何通过给出它的id来在我的模板中显示任何翻译的值.例如,我想使用它EmployerWorkerNumberRange.EMPLOYER_WORKER_NUMBER_RANGE[0]
你能建议我吗?
谢谢
我试图通过使用具有 category_tags.py 文件(也是 init.py)的本地 templatetags 文件夹创建目录应用程序的本地版本来覆盖 category_tags。似乎使用了默认的 category_tags 文件。如果我更改了本地标签文件的名称,当然我在模板中加载了标签的新名称,但我想覆盖或扩展默认的 category_tags 而不是创建另一个。
有任何想法吗?
谢谢!
在Django管理员更改列表模板中,有一个块:
{% block result_list %}
{% if action_form and actions_on_top and cl.show_admin_actions %}{% admin_actions %}{% endif %}
{% result_list cl %}
{% if action_form and actions_on_bottom and cl.show_admin_actions %}{% admin_actions %}{% endif %}
{% endblock %}
Run Code Online (Sandbox Code Playgroud)
我想知道{% result_list cl %}该做什么,即什么cl意思?我在文档中找不到它。
我想为html属性编写Django条件,例如
<a {% if item.link %} href="{{ item.link }}", target="_blank", rel="noopener", aria-label="{{ item }}" {% endif %}>
--- Content ---
</a>
Run Code Online (Sandbox Code Playgroud)
我正在使用pug / jade,因此无法将jade / pug语法放入“ Content”块中,编译器会中断。我想知道是否可以以任何方式处理该问题,而不重复“ Content”块。
我也尝试过,没有成功:
a({% if item.link %} href="{{ item.link }}", target="_blank", rel="noopener", aria-label="{{ item }}" {% endif %})
----Content---
Run Code Online (Sandbox Code Playgroud) django ×10
templatetags ×10
python ×2
django-oscar ×1
enums ×1
mako ×1
overriding ×1
pug ×1
pygments ×1
random ×1
request ×1
scope ×1
templates ×1