django – 对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)

现在,这是用户所有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?
>如何获取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 %}

相关文章

功能概要:(目前已实现功能)公共展示部分:1.网站首页展示...
大体上把Python中的数据类型分为如下几类: Number(数字) ...
开发之前第一步,就是构造整个的项目结构。这就好比作一幅画...
源码编译方式安装Apache首先下载Apache源码压缩包,地址为ht...
前面说完了此项目的创建及数据模型设计的过程。如果未看过,...
python中常用的写爬虫的库有urllib2、requests,对于大多数比...