2014-03-05 123 views
4

假设这是一个用户的照片的模型:困惑的ContentType

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') 
  1. 在上述class StreamItem,请问content_type是实例的data_type?

  2. 什么是object_id?它是content_type实例的pk还是该StreamItem实例的pk?

  3. 如何获得content_type实例(照片和状态)的pub_date并将其初始化为StreamItem实例?

  4. 最后,我该如何在模板中渲染它?因为我不知道它是文字还是图片。

谢谢。

+2

对于基础知识,你最好阅读[CONTENTTYPES框架(https://docs.djangoproject.com/en/1.4/ref/contrib/contenttypes) – FallenAngel

回答

1

这是一个非常快速回答:

1)CONTENT_TYPE将对象类型你的情况(照片或状态),请参阅Django contenttypes framework以获得更多关于如何工作的。

2)OBJECT_ID将照片或状态

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 %}