django模板中的不同内容类型对象

时间:2014-03-06 18:20:37

标签: django django-templates django-contenttypes

我很难理解ContentType。我正在从教程中学习,这是link。我已同步数据库,并在管理员中工作。但是当我尝试在模板中加载ContentType对象时,我什么也得不到。当我看到页面来源时,get_rendered_method未在homepage.html中加载呈现的模板。

这些是我的模特:

class Photo(models.Model):
    user = models.ForeignKey(User)
    description = models.TextField()
    image = models.ImageField(upload_to=get_upload_file_name)
    photo_upload = models.DateTimeField(auto_now=True, auto_now_add=False)
    is_public = models.BooleanField(default=True)

    class Meta:
        verbose_name = 'Photo'
        verbose_name_plural = 'Photos'
        ordering = ['-photo_upload']

class Status(models.Model):
    user = models.ForeignKey(User)
    state = models.CharField(max_length=200)
    status_upload = models.DateTimeField(auto_now=True, auto_now_add=False)
    is_public = models.BooleanField(default=True)

class StreamItem(models.Model):
    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    pub_date = models.DateTimeField()
    content_object = generic.GenericForeignKey('content_type','object_id')

    # The get_rendered_html method simply passes the retrieved object to a template with that object’s name
    def get_rendered_html(self):
        template_name = 'stream_item_%s.html' % (self.content_type.name)
        return render(request, template_name, {'object':self.content_object})

这些是content_type.name:

的模板

stream_item_Photo.html:

<div class="si">
    <img src="{{ object.image }}">
    <p>{{ object.pub_date|date:"F jS Y, P" }}</p>
    <p>{{ object.user }}</p>
</div>

stream_item_Status.html:

<div class="si">
    <p>{{ object.state }}</p>
    <p>{{ object.time|date:"F jS Y, P" }}</p>
    <p>User: {{ object.user }}</p>
</div>

我在哪里做错了?如何在模板中加载不同的content_type对象?如果你能帮我解决这个问题我真的很感激。谢谢!

修改

我在homepage.html中调用get_rendered_html。这是homepage.html:

<div class="container">
  <div class="row">
      {% for stream_item in stream_item_list %}
          <div class="col-md-4">
              {{ stream_item.get_rendered_html }}
          </div>
      {% endfor %}
  </div>
</div>

1 个答案:

答案 0 :(得分:2)

您在render中使用的方法get_rendered_html实际上不返回字符串或您可以在模板中直接使用的任何内容,它会返回HttpResponse个对象。 HttpResponse对象基本上由呈现的模板和Http头组成。

from django.template.loader import render_to_string
from django.utils.safestring import mark_safe

class StreamItem(models.Model):
    ...
    def get_rendered_html(self):
        template_name = 'stream_item_%s.html' % self.content_type.name
        return mark_safe(render_to_string(template_name, {'object': self.content_object}))

render_to_stringrender的作用相同,只是它只返回一个包含渲染模板的字符串,没有任何标题信息。 mark_safe标记字符串在模板中直接使用是安全的。没有它,字符串中的任何html标签将在主页模板中使用时被转义。