J'ai créé un site web avec djangoCMS et utilise beaucoup apphooks, plugins cms, wizards, etc. Nous avons une application simple avec un seul modèle contenant les données de base qui devraient être affichées sur la page d'accueil .Inclusion personnalisée templatetag avec djangoCMS render_model
models.py
from django.db import models
from django.utils.text import slugify
from django.urls import reverse
from cms.models.fields import PlaceholderField
from djangocms_text_ckeditor.fields import HTMLField
class Programme(models.Model):
name = models.CharField(max_length=60, unique=True)
slug = models.SlugField()
icon = models.CharField(max_length=50, unique=True)
introduction = HTMLField()
overview = PlaceholderField(
'programme_overview',
related_name='programmes_overview'
)
def __str__(self):
return self.name
def get_absolute_url(self):
return reverse(
'programmes:programme-detail',
kwargs={'slug': self.slug}
)
def save(self, *args, **kwargs):
if not self.pk:
self.slug = slugify(self.name)
super(Programme, self).save(*args, **kwargs)
j'ai décidé de créer une inclusion personnalisée templatetag à cet effet.
templatetags/programmes_tags
from django import template
from ..models import Programme
register = template.Library()
@register.inclusion_tag('programmes/programme_list.html')
def programme_list():
programmes = Programme.objects.all()
return {'programmes': programmes}
Dans le modèle que j'utilise render_model
du cms_tags
, parce que les éditeurs devraient pouvoir modifier le contenu dans le frontend. Voici le modèle:
templates/programmes/programme_list.html
{% load cms_tags %}
{% for programme in programmes %}
<div class="col-lg-2 col-md-4 col-sm-6 col-xs-12 text-center flex-item">
<div class="service-box">
<i class="fa fa-4x {{ programme.icon }} text-primary" style="visibility:visible;"></i>
<h3>
<a href="{% url 'programmes:programme-detail' programme.slug %}">
{{ programme.name }}
</a>
</h3>
<p class="text-muted">
{% render_model programme 'introduction' %}
</p>
</div>
</div>
{% endfor %}
La balise est maintenant utilisé dans le modèle pour la page d'accueil:
{% load programmes_tags %}
{% programme_list %}
Quand j'ouvre la page d'accueil, il renvoie une erreur:
KeyError: 'request'
De toute évidence, la La balise render_model
doit accéder au request
. Lorsque je tente de changer le templatetag comme ceci:
@register.inclusion_tag('programmes/programme_list.html', takes_context=True)
def programme_list(context):
programmes = Programme.objects.all()
context.update({'programmes': programmes})
return context
le request
est passé dans le cadre du RequestContext, mais cette erreur est renvoyée:
ValueError: dictionary update sequence element #1 has length 1; 2 is required
Comment dois-je mettre à jour correctement la RequestContext?
Si l'utilisation d'un templatetag n'est pas la bonne approche, veuillez indiquer quelle serait la meilleure solution.
Merci d'avoir répondu. J'ai essayé aussi, mais ça n'aide pas. L'erreur générée est la suivante: 'django.template.exceptions.TemplateSyntaxError: Vous devez activer le processeur de contexte de modèle 'sekizai.context_processors.sekizai' ou utiliser 'sekizai.context.SekizaiContext' pour rendre vos modèles. ' – cezar
Et je dois noter que' sekizai.context_processors.sekizai' est présent dans les paramètres de 'TEMPLATES [0] ['OPTIONS'] ['context_processors']'. – cezar