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 模板自定义标签为布尔值

Django:自定义模板简单标签应该引发异常还是静默失败?

Django 自定义 500 错误模板不显示 request.user

Django——模板层(template)(模板语法自定义模板过滤器及标签模板继承)

Google App Engine 中的 Django 自定义模板标签

我的自定义 Django 模板过滤器但没有任何其他过滤器的“无效过滤器”错误