Django自定义模板标记不返回任何值

时间:2014-08-23 20:02:10

标签: django django-templates

我正在学习如何创建和使用自定义模板标签。 official documentation非常适合描述如何添加模板标签功能等,但它并没有说明实际创建一个。

我的问题是我试图在我的views.py文件中返回以下随机网址选项的值,但我的网页中没有显示任何内容。

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的

然后,这个随机网址会在start.html的按钮中加载到href" "。我正在加载survey_extras并已包含模板标记。

{% load survey_extras %} 
<a class="btn btn-success" href="{{survey_url}}">START</a>

项目结构

我在我的应用程序中创建了templatetags目录,并包含一个__init__.py文件 project structure

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 个答案:

答案 0 :(得分:1)

正如@Brandon所说,你在做:

from django import template    
register = template.Library()
from survey.views import start

@register.simpletag        
def survey_url():
    return ''

如果您正在执行以下操作,您希望从自定义模板标记中获得什么:

def survey_url():
    return ''

您必须创建一个“随机”选择任何网址的功能。获取随机网址的函数示例如下:

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
  • 第一种方式返回网址名称(您需要制作类似..href =“{%url survey_url%}”)。
  • 第二个返回url模式,就像它在你的url文件中一样

这种功能的问题在于,如果您有复杂的网址来管理以下代码:

u'^your_url/(?P<item_id>\\w+)?/?$'

如果您没有将必要的属性传递给网址,模板将会出错。可能的解决方案可能是在一个文件中包含您要“随机化”的网址和其他文件中的复杂网址。