假设这是用户照片的模型:
class Photo(models.Model): user = models.ForeignKey(User) title = models.CharField() image = models.ImageField() pub_date = models.DateTimeFied(auto_Now=True,auto_Now_add=pub_date) update = models.DateTimeFied(auto_Now=False,auto_Now_add=True)
class Status(models.Model): user = models.ForeignKey(User) tweet = models.TextFied() pub_date = models.DateTimeFied(auto_Now=True,auto_Now_add=pub_date)
class StreamItem(models.Model): user = models.ForeignKey(User) content_type = models.ForeignKey(ContentType) object_id = models.PositiveIntegerField() content_object = GenericForeignKey('content_type','object_id')
>在上面的类StreamItem中,content_type是实例的data_type吗?
>什么是object_id?它是content_type实例的pk还是该StreamItem实例的pk?
>如何获取content_type实例的pub_date(Photo和Status)并将其初始化为StreamItem实例?
>最后,如何在模板中渲染它?因为我不知道它是文字还是图像.
谢谢.
解决方法
这是一个非常快速的答案:
1)content_type将是对象类型(在您的情况下为照片或状态),有关其工作原理的更多信息,请参阅Django contenttypes framework.
2)object_id将是Photo或Status的主键
3)要访问泛型的属性,请通过content_object属性访问它们
stream_item.content_object.pub_date
4)我会根据你想要的方式在每个模型上创建一个方法.这可以与python的模板系统一起使用.将方法命名为可以像接口一样调用它的方法.
class Status(models.Model): ... def render_widget(self): return render_to_string('status_widget.html',{'status' : self }) class Photo(models.Model): ... def render_widget(self): return '<span>My HTML Here</span>'
在模板中使用:
{% for item in stream_items %} {{ item.content_object.render_widget }} {% endfor %}