2017-10-10 5 views
4

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.

Répondre

0

Laissez preneur_context être là et utilisez votre ancien code. Je n'ai pas testé cela.

@register.inclusion_tag('programmes/programme_list.html', takes_context=True) 
def programme_list(context): 
    request = context['request'] 
    programmes = Programme.objects.all() 
    return {'programmes': programmes, 'request': request} 
+0

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

+0

Et je dois noter que' sekizai.context_processors.sekizai' est présent dans les paramètres de 'TEMPLATES [0] ['OPTIONS'] ['context_processors']'. – cezar