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
Liens | Site |
---|---|
Django How can i split string using template tag | stackoverflow |
Custom template tags and filters | stackoverflow |
how to split the string in django template? | stackoverflow |