sortfact
sortfact

Reputation: 31

How to display Model in each HTML template?

But create a request in each functions inside views.py I do not want.
Is it possible to output the model in each template using only one request?
I tried to use templateetags but
that so

@register.simple_tag(takes_context=True)
def header_categories(context):
    return Categorie.objects.all().order_by('id')

what is like that

@register.simple_tag(takes_context=True)
def header_categories(context):
    categories = Categorie.objects.all().order_by('id')
    args = {}
    
    for cat in categories:
        args[cat.text] = {
        'id':cat.id,
        }
        if cat.parent:
            args[cat.text]['parent_id'] = cat.parent.id
            args[cat.text]['parent_text'] = cat.parent.text
    return args

Nothing works correctly

{% for cat in header_categories %}
    cat.text
{% endfor %}

I tried through js

 var arr = {%header_categories%}

but django changes everything

 {'dresses': {'id': 19},

Upvotes: 0

Views: 229

Answers (2)

Abdul Aziz Barkat
Abdul Aziz Barkat

Reputation: 21787

You need to make a custom context processor (See Using RequestContext [Django docs]). What this would do is add a variable to the context for each template. Quoting the documentation:

The context_processors option is a list of callables – called context processors – that take a request object as their argument and return a dictionary of items to be merged into the context.

In some suitable app of yours make a file named context_processors.py and add this code in it:

def header_categories(request):
    return {'header_categories': Categorie.objects.all().order_by('id')}

Now in your settings in the TEMPLATES settings add this context processor to the list context_processors, so it should look like:

[
    'django.template.context_processors.debug',
    'django.template.context_processors.request',
    'django.contrib.auth.context_processors.auth',
    'django.contrib.messages.context_processors.messages',
    'your_app.context_processors.header_categories',
]

Now in your templates you can simply write:

{% for cat in header_categories %}
    {{ cat.text }}
{% endfor %}

Upvotes: 0

fakeMake
fakeMake

Reputation: 778

Before going deeper into your question, I think you should have

{% for cat in header_categories %}
    {{ cat.text }}  
{% endfor %}

Upvotes: 1

Related Questions