2017-10-10 6 views
4

djangoCMSを使用してウェブサイトを作成し、apphooks、cmsプラグイン、ウィザードなどを多用しています。私たちは、ホームページに表示されるべきコアデータ。djangoCMSレンダリングモデルのカスタムインクルードtemplatetag

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) 

私は、この目的のためにカスタム包含templatetagを作成することを決めました。編集者は、フロントエンドで内容を編集することができるはずですので、私は、cms_tagsからrender_modelを使用したテンプレートで

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} 

。ここではテンプレートは次のとおりです。

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 %} 

タグは、現在、ホームページ用のテンプレートで使用されている:私はホームページを開くと

{% load programmes_tags %} 
{% programme_list %} 

それはエラーがスローされます。

KeyError: 'request' 

明らかにrender_modelタグはrequestにアクセスする必要があります。私はこのようなtemplatetag変更しようとすると:

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

requestRequestContextのの一部として渡されますが、このエラーがスローされます。

ValueError: dictionary update sequence element #1 has length 1; 2 is required 

を、私は適切に更新する必要がありますどのようにRequestContext
templatetagを使用するのが適切な方法でない場合は、より良い解決策を教えてください。

答えて

0

take_contextをそこに置き、古いコードを使用します。これをテストしていない。

@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

ありがとうございます。私もそれを試みたが、それは助けにはならない。 'django.template.exceptions.TemplateSyntaxError: 'sekizai.context_processors.sekizai'テンプレートコンテキストプロセッサを有効にするか、 'sekizai.context.SekizaiContext'を使用してテンプレートをレンダリングする必要があります。 – cezar

+0

そして、 sekizai.context_processors.sekizai'は 'TEMPLATES [0] ['OPTIONS'] ['context_processors']'の設定にあります。 – cezar

関連する問題