我正在学习如何创建和使用自定义模板标签。 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
文件
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代码。
谁能告诉我哪里出错了?谢谢; - )
答案 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
这种功能的问题在于,如果您有复杂的网址来管理以下代码:
u'^your_url/(?P<item_id>\\w+)?/?$'
如果您没有将必要的属性传递给网址,模板将会出错。可能的解决方案可能是在一个文件中包含您要“随机化”的网址和其他文件中的复杂网址。