Django 自定义模板标签不返回任何值
Posted
技术标签:
【中文标题】Django 自定义模板标签不返回任何值【英文标题】:Django Custom Template Tag not returning any value 【发布时间】:2014-10-17 10:06:05 【问题描述】:我正在学习如何创建和使用自定义模板标签。 official documentation 非常擅长描述如何添加模板标签功能等,但它并没有说明如何实际创建模板标签。
我的问题是我试图在我的 views.py 文件中返回以下随机 url 选择的值,但我的页面中没有出现任何内容。
views.py
这样做的想法是survey_url
(模板标签)在用户单击开始按钮时采用随机 URL 值将用户引导至三个调查之一。
def start(request):
survey_urls = ['/surveyone/', '/surveytwo/', '/surveythree/']
survey_url = random.choice(surveys)
return render(request, 'start.html', 'survey_url': survey_url)
.html
然后,这个随机 URL 将被加载到 start.html 上的按钮中的 href" "
中。我正在加载 survey_extras
并包含模板标签。
% load survey_extras %
<a class="btn btn-success" href="survey_url">START</a>
项目结构
我在我的应用程序中创建了 templatetags 目录并包含了一个 __init__.py
文件
survey_extras.py
这是我有点卡住的地方。似乎没有很多在线教程(我可以找到)处理如何编码。我一直在看this video,但它比我需要的复杂得多。我也一直在看这个问题Django - Simple custom template tag example,但似乎无法理解。
from django import template
register = template.Library()
from survey.views import start
@register.simpletag
def survey_url():
return ''
目前我没有收到任何错误,当我检查按钮元素时没有出现额外的 URL 代码。
谁能告诉我哪里出错了?谢谢;-)
【问题讨论】:
我不明白您为什么要在此处使用自定义模板标签。您将值直接从视图发送到模板:不需要新标签。 不要粗鲁,但是当您的模板标签返回一个空字符串时,您为什么希望模板中存在一个值? 【参考方案1】:正如@Brandon 所说的那样:
from django import template
register = template.Library()
from survey.views import start
@register.simpletag
def survey_url():
return ''
如果您正在这样做,您希望从自定义模板标签中收到什么:
def survey_url():
return ''
您必须创建一个函数来“随机”选择您的任何网址。获取随机 url 的函数示例如下:
from django import template
from django.core.urlresolvers import get_resolver
from django.core.urlresolvers import reverse
import random
register = template.Library()
from survey.views import start
@register.simpletag
def survey_url():
# First we need to get a list of the url's
url_list = get_resolver(None).reverse_dict.keys()
# Then we generate random number from 0 to url_list lenght
random_number = random.randint(0, len(url_list)-1)
# and then we return one value of the list
return reverse(url_list[random_number])
其他选项是使用 urlpatterns:
from django import template
register = template.Library()
from survey.views import start
import urls
@register.simpletag
def survey_url():
# First we need to get a list of the url's
url_list = urls.patterns
# Then we generate random number from 0 to url_list lenght
random_number = random.randint(0, len(url_list)-1)
# and then we return one value of the list
return url_list[0].regex.pattern
第一种方法返回一个 url 的名称(你需要做类似 ..href="% urlsurvey_url %" 的东西)。
第二个返回 url 模式,因为它在您的 urls 文件中
这种函数的问题在于,如果你有复杂的 url 来管理如下代码:
u'^your_url/(?P<item_id>\\w+)?/?$'
如果您没有将必要的属性传递给 url,模板将会出错。可能的解决方案是在一个文件中包含您想要“随机化”的 url,而在另一个文件中包含复杂的 url。
【讨论】:
以上是关于Django 自定义模板标签不返回任何值的主要内容,如果未能解决你的问题,请参考以下文章
Django 自定义 500 错误模板不显示 request.user
Django——模板层(template)(模板语法自定义模板过滤器及标签模板继承)