2017-10-10 155 views
4

我創建了一個網站,djangoCMS和大量使用apphooks的,CMS插件,嚮導,等我們有隻用一個模型控股應在主頁上顯示的核心數據的簡單應用程序。自定義包含templatetag 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) 

我決定爲此創建一個自定義包含templatetag。

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} 

在我使用來自cms_tagsrender_model模板,因爲編輯們應該可以在前臺編輯的內容。這裏是模板:

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 

request被作爲的RequestContext的部分已經結束了,但隨後引發此錯誤:

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

我應該如何正確地更新RequestContext
如果使用模板標籤不是正確的方法,請指出什麼是更好的解決方案。

回答

0

讓takes_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」來渲染templates.' – cezar

+0

我應該注意的是' sekizai.context_processors.sekizai'存在於'TEMPLATES [0] ['OPTIONS'] ['context_processors']'中的設置中。 – cezar