htmldjangotemplatesdjango-templatestemplatetags

build an includable template as string [django]


I want to build a list of clickable links for my nav, and because these are links to my site, I want to use the url-tag. I get a list of dictonaries which knows all names for the links and create a template string with them with this function:

def get_includable_template(links):
  output = '<ul>'
  for link in links:
    output = output + '<li><a href="{% url' + get_as_link(link) + '%}>" + link['shown'] + '</a></li>'
  output = output + '</ul>

links looks like this:

links = [
  {'app': 'app1', 'view': 'index', 'shown': 'click here to move to the index'},
  {'app': 'app2', 'view': 'someview', 'shown': 'Click!'}
]

get_as_link(link) looks like this:

def get_as_link(link):
  return "'" + link['app'] + ':' + link['view'] + "'"

The first method will return a template, which looks like this (but it's all in the same code line):

<ul>
  <li><a href="{% url 'app1:index' %}">click here to move to the index</a></li>'
  <li><a href="{% url 'app2:someview' %}">Click!</a></li>
</ul>

I want this to be interpreted as template and included to another template.

But how to include this?

Let's say, my other template looks like this:

{% extends 'base.html' %} 
{% block title %}App 1 | Home{% endblock %}
{% block nav %}INCLUDE THE TEMPLATE HERE{% endblock %}
{% block content %}...{% endblock %}

What I have already tried:

Is there a good solution about this?


Solution

  • You are making this more complicated than it needs to be.

    Firstly, it seems that the only reason you need this to be interpreted as a template is so that it parses the url tag. But there is already a way of creating links in Python code, and that is the reverse() function. You should use that instead.

    Secondly, the way to dynamically generate content for use inside a template is to use a custom template tag.