2014-08-23 5 views
1

Я изучаю, как создавать и использовать пользовательские теги шаблона. official documentation отлично подходит для описания того, как добавить функциональность templatetag и т. Д., Но он не говорит о том, чтобы создать его.Django Custom Template Tag не возвращает никакого значения

Моя проблема заключается в том, что я пытаюсь вернуть значение выбранного случайного URL-адреса в файле 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

Этот случайный URL-адрес затем предназначается, чтобы быть загружены в href" " в виде кнопки на start.html. Я загружаю 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 '' 

В настоящее время я не получаю ошибок, и когда я проверяю элемент кнопки, код дополнительного кода не появляется.

Может ли кто-нибудь сказать мне, где я иду не так? Спасибо ;-)

+1

Я не понимаю, почему вы хотите использовать шаблонный тег здесь. Вы отправляете значение прямо из представления в шаблон: никаких новых тегов не требуется. –

+1

Не быть грубым, но почему вы ожидаете, что значение будет присутствовать в шаблоне, когда тег шаблона вернет пустую строку? – Brandon

ответ

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-адресов. Пример функции, чтобы получить случайный 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 = "{% url survey_url%}").
  • Второй вернуть Шаблон URL, как в свой файл URLs

Проблема с такого рода функций является то, что если у вас есть сложные URLs, которые управляют коды, как:

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

в шаблон получит ошибки, если вы не передадите необходимые атрибуты URL. Возможным решением может быть наличие в одном файле URL-адресов, которые вы хотите «рандомизировать», и сложных URL-адресов в другом файле.

Смежные вопросы