对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. 在上面的StreamItem类中,将为content_type实例的data_type吗?

  2. 什么object_idcontent_type实例的pk还是该StreamItem实例的pk?

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

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

谢谢。

科里

这是一个非常快速的答案:

1)content_type将是对象类型(在您的情况下为Photo或Status),有关如何工作的更多信息,请参见Django contenttypes框架

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章