2017-10-10 154 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