Search code examples
pythondjangodjango-templatesdjango-context

For loop and with tag in a Django template


I have a context built in this way:

def end(request):
    numero_debitori = request.session['numero_debitori']
    dati_totali = {'numero_debitori': numero_debitori}
    if request.session['tipo_creditore'] == 'PF':
        dati_totali['creditore'] = {
            'tipo': 'Persona Fisica',
            'dati': {
                'nome': request.session[f'nome'],
                'cognome': request.session[f'cognome'],
                'luogo_di_nascita': request.session[f'luogo_di_nascita'],
                'data_di_nascita': request.session[f'data_di_nascita'],
                'comune_di_residenza': request.session[f'comune_di_residenza'],
                'indirizzo_di_residenza': request.session[f'indirizzo_di_residenza'],
                'email': request.session[f'email'],
                'pec': request.session[f'pec'],
                'codice_fiscale': request.session[f'codice_fiscale'],
                'partita_iva': request.session[f'partita_iva'],
            }
        }
    elif request.session['tipo_creditore'] == 'PJ':
        dati_totali[f'creditore'] = {
            'tipo': 'Persona Giuridica',
            'dati': {
                'denominazione_sociale': request.session[f'denominazione_sociale'],
                'comune_sede_principale': request.session[f'comune_sede_principale'],
                'indirizzo_sede_principale': request.session[f'indirizzo_sede_principale'],
                'email': request.session[f'email'],
                'pec': request.session[f'pec'],
                'codice_fiscale': request.session[f'codice_fiscale'],
                'partita_iva': request.session[f'partita_iva'],
            }
        }

    for i in range(numero_debitori):
        if request.session[f'tipo_{i}'] == 'PF':
            dati_totali[f'debitore_{i}'] = {
                'tipo': 'Persona Fisica',
                'dati': {
                    'nome': request.session[f'nome_{i}'],
                    'cognome': request.session[f'cognome_{i}'],
                    'luogo_di_nascita': request.session[f'luogo_di_nascita_{i}'],
                    'data_di_nascita': request.session[f'data_di_nascita_{i}'],
                    'indirizzo_di_residenza': request.session[f'indirizzo_di_residenza_{i}'],
                    'codice_fiscale': request.session[f'codice_fiscale_{i}'],
                    'partita_iva': request.session[f'partita_iva_{i}'],
                }
            }
        elif request.session[f'tipo_{i}'] == 'PJ':
            dati_totali[f'debitore_{i}'] = {
                'tipo': 'Persona Giuridica',
                'dati': {
                    'denominazione_sociale': request.session[f'denominazione_sociale_{i}'],
                    'sede_principale': request.session[f'sede_principale_{i}'],
                    'codice_fiscale': request.session[f'codice_fiscale_{i}'],
                    'partita_iva': request.session[f'partita_iva_{i}'],
                }
            }
    context = {'dati_totali': dati_totali}
    return render(request, 'end.html', context)

Inside end.html I'm trying to access to f'debitore_{i}' in this way but nothing was shown:

{% for i in dati_totali %}
    {% with debitore_|add:i as debitore %}
        {{dati_totali.debitore.tipo}}
    {% endwith %}
{% endfor %}

I don't know what's wrong with this code. I also tried to print the data inside the terminal to check if the data inside the session does exists and yes, they exists.


Solution

  • The i variable in your template is not referencing the index.
    Have a look, and just show {{i}} as text, see the output.

    To reference the index of a for loop in a django template, you could use {{forloop.counter0}} or {{forloop.counter}} inside of the loop.

    {{forloop.counter0}} starts at the number 0, respectively
    {{forloop.counter}} starts at one.

    You could probably do what you're doing with a custom template filter, passing in the forloop.counter0, and then getting the right index from your i variable. Syntax for this would look something like this:

    {% with i|get_variable:forloop.counter0 as new_variable_name %}
    

    https://docs.djangoproject.com/en/4.1/howto/custom-template-tags/#writing-custom-template-filters