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

django模板中的不同内容类型对象,django,django-templates,django-contenttypes,Django,Django Templates,Django Contenttypes,我很难理解ContentType。我是从一个教程中学习的,这是最重要的。我已经同步了数据库,它在管理中工作。但是当我尝试在模板中加载ContentType对象时,我什么也得不到。当我看到页面源代码时,get_rendered_方法没有在homepage.html中加载呈现的模板 这些是我的模型: class Photo(models.Model): user = models.ForeignKey(User) description = models.TextField()

我很难理解ContentType。我是从一个教程中学习的,这是最重要的。我已经同步了数据库,它在管理中工作。但是当我尝试在模板中加载ContentType对象时,我什么也得不到。当我看到页面源代码时,
get_rendered_方法
没有在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>

get\u rendered\u html
中使用的
render
方法实际上不返回字符串或任何可以直接在模板中使用的内容,而是返回一个
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_string
render
的操作相同,只是它只返回一个包含渲染模板的字符串,而不返回任何标题信息
mark_safe
将字符串标记为可在模板中直接使用的安全字符串。如果没有它,字符串中的任何html标记将在主页模板中使用时转义

你把get_rendered_html称为哪里?@Jay我在主页上称之为。我已经更新了问题。请看一看。谢谢,你好!我在models.py中导入了
render_to_strings
mark_safe
。并按照您告诉我的那样更新了
get\u rendered\u html
方法。但是,它仍然没有显示任何内容。现在的原因可能是什么?您是否有任何错误,或者它只是不渲染?您确定流项目列表中是否包含值了吗?是的!你是对的。里面什么都没有!!!但我也没有收到任何错误…您好,我只是想知道这种调用模板的方式是否适合制作大量照片和状态?还是最好在主页中加载
si
StreamItem
实例并执行一些
操作(如果其他操作
)?请给我你的建议,并在你的回答中加上。再次感谢你@罗宾:这种方法非常适合生产。这两种方法都迭代一次
stream\u item\u list
,并将一些字符串解析到文件中。这两种方法都没有任何明显的优势。如果“lots”真的很多,并且你想包括所有项目,那么看看你是否还没有。无论使用何种显示方法,这都是良好的做法。
<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>
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}))