2017-01-13 4 views
1

Я изучаю Django, строя небольшой сайт, и я обнаружил, что у меня много шаблонов, где я перечисляю объекты, каждый из которых имеет ссылку на него. я думал, что я мог бы сделать пользовательский тег шаблона, что-то вродеКак передать URL-адрес в пользовательском теге шаблона?

{% object_list some %} 

some является словарем {'list': obj_list, 'link': link} где obj_list список объектов Я хочу, чтобы распечатать и link должны некоторые URL структура, которая указывает на предмет.

шаблон (называемый object_list.html) должен выглядеть

{% for object in object_list %} 
    <li><a href="{% url myapp:object object.id %}">{{object.name}}</a></ 
{% endfor %} 

Теперь моя проблема заключается в том, что я не знаю, что делать в ссылке. Я хочу, чтобы он был гибким, так что «myapp: object» заменяется ссылкой «link», например, если тип объекта - «Пользователь», то я использую {%url myapp:user user.id%}.

Это можно сделать? Как?

Я попытался this solution в виде

{% for object in object_list %} 
    {% url 'link' as my_url %} 
    <li><a href="{% url my_url object.id %}">{{object.name}}</a></li> 
{% endfor %} 

дает 'myapp:myobject' в качестве аргумента, но он не работает. Чтобы быть точным, в шаблоне

{% load property_extras %} 
{% object_list property_dict %} 

где property_dict это мой аргумент, и templatetag/property_extras.py является файл, в котором сохраняется тег, дает ошибку NoReverseMatch (если я использую обычный шаблон -Без обычай tag- это работает отлично).

Для получения дополнительной информации, мой шаблон тег

@register.inclusion_tag('properties/object_list.html') 
def object_list(object_dict): 
    print(object_dict['list']) 
    print(object_dict['link']) 
    return { 
     'object_list': object_dict['list'], 
     'link': object_dict['link'], 
     } 

ответ

4

Я считаю, что вы можете использовать

{% for object in object_list %} 
    <li><a href="{{ object.get_absolute_url }}">{{object.name}}</a></li> 
{% endfor %} 

и отменить использование {% url %} в целом. Определение метода get_absolute_url для вашей модели является рекомендуемым способом решения проблемы в соответствии с documentation.

2

Использование {% url 'link' as my_url %} не работает, потому что вы используете буквенную строку 'link', и вы не включили идентификатор объекта. Вы имеете в виду:

{% url link object.id as my_url %} 

Это не понятно, почему вы сохраните результат my_url, потому что вы не используете my_url в любом месте. Может быть, вы хотите, чтобы следующая строка будет:

<a href="{{ my_url }}">{{object.name}}</a></li> 

Однако, я не думаю, что вам действительно нужно as my_url здесь. Он тихо проглатывает ошибки, которых вы, вероятно, не хотите. Было бы проще сделать:

<a href="{% url link object.id as my_url %}">{{object.name}}</a></li>