Comment créer une liste d'éléments à partir d'une chaîne de caractères dans un template sous django ?

Published: 04 avril 2020

DMCA.com Protection Status

Exemple de comment créer une liste d'éléments à partir d'une chaîne de caractères dans un template sous django

Introduction

Prenons par exemple la table suivante (intitulée Note) dans le fichier models.py comprenant la ligne tags (models.TextField(): chaîne de caractères)

class Note(models.Model):
    ... = ...   
     ... = ...  
     ... = ...  
    tags = models.TextField()

tags est utilisé pour stocker des labels séparés par un point virgule ; (i.e. for example: New_York; Travel; Photo).

L'objectif est de créer une liste d'éléments à partir de tags dans un template.

Créer un filtre

La structure d'une application django ressemble à:

/my_app/
    /templates/
    /static/
    models.py
    views.py

dans le dossier my_app, créer un dossier intitulé templatetags:

mkdir templatetags

on a alors

/my_app/
    /templates/
    /static/
    models.py
    views.py
    /templatetags/

aller dans le dossier templatetags et creer un fichier vide

__init__.py

puis in fichier intitulé filter.py

from django import template

register = template.Library()

@register.filter(name='split')
def split(value, key):
  """
    Returns the value turned into a list.
  """
  return value.split(key)

Editer le fichier settings.py

Ajouter dans le fichier settings.py:

'libraries':{
   # make your file entry here.
   'filter_tags': 'my_app.templatetags.filter',
}

donne

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',     
            ],
            'libraries':{
               # make your file entry here.
               'filter_tags': 'my_app.templatetags.filter',
            }
        },
    },
]

Créer une vue dans le fichier views.py

Créer une vue et passer la table note:

from .models import Note

def images_view(request):
    ...
    ...
    ...
    note_obj = Note.objects.all()
    context = {'note_obj':note_obj}
    return render(request, "my_app/template.html", context )

Créer une liste dans un template en utilisant le filtre

Dans template.html ajouter en haut la ligne suivante:

{% load filter_tags %}

maintenant on peut utiliser le filtre pour boucler sur les labels:

{% with note_obj.tags|split:";" as tags %}
    {% for tag in tags %}
        {{tag}}
    {% endfor %}
{% endwith %}

Références