【问题标题】:Confused about ContentType对 ContentType 感到困惑
【发布时间】:2014-03-05 10:30:53
【问题描述】:

假设这是用户照片的模型:

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_id?是 content_type 实例的 pk 还是该 StreamItem 实例的 pk?

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

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

谢谢。

【问题讨论】:

标签: django django-templates django-contenttypes


【解决方案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 %}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-13
    • 2012-07-22
    • 2013-05-13
    • 2020-04-16
    • 2023-03-08
    • 2019-08-04
    • 2019-12-30
    • 2022-01-20
    相关资源
    最近更新 更多