假设这是用户照片的模型:
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)
现在,这是用户所有Feed的模型:
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?
如何获取pub_date
实例的content_type
(照片和状态)并将其初始化为StreamItem实例?
最后,如何在模板中渲染它?因为我不知道它是文字还是图像。
谢谢。
答案 0 :(得分:1)
这是一个非常快速的答案:
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 %}