我很难理解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>
答案 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_string
与render
的作用相同,只是它只返回一个包含渲染模板的字符串,没有任何标题信息。 mark_safe
标记字符串在模板中直接使用是安全的。没有它,字符串中的任何html标签将在主页模板中使用时被转义。