显示已发布页面和草稿页面的页面上的Django-CMS外键

时间:2013-05-26 23:37:56

标签: django django-cms

我最近从Django-CMS 2.3.5升级到2.4.1。

以前我有一个这样的模型:

from django.db import models
from cms.models.pagemodel import Page

class MyModel(models.Model):
    my_page = models.ForeignKey(Page)

在管理员中,这很可让我选择与MyModel相关联的页面。

现在我已经升级,并在我的所有页面上按下“发布草稿”,同一管理页面在其选择框中显示每个页面的两个副本 - 一个已发布,一个草稿。

有些further investigation发现teaser插件在其定义中添加了以下内容以解决此问题:

    page_link = models.ForeignKey(Page,
        limit_choices_to={'publisher_is_draft': True},
        ...)

同样,我曾经能够在我的视图中查找页面网址,如下所示:

Page.objects.get(reverse_id='update').get_absolute_url()

但现在我必须使用:

Page.objects.get(reverse_id='update', publisher_is_draft=False).get_absolute_url()

这看起来有点难看。

现在limit_choices_to中的get和额外字段是否必要?或者是否有更简洁的方式来查看已发布的页面? (例如,我注意到其他cms插件,例如链接,图片,使用没有limit_choices_to参数的外键。)

1 个答案:

答案 0 :(得分:5)

为了更好地处理cms页面的外键,您需要使用PageField而不是ForeignKey

https://django-cms.readthedocs.org/en/2.4.3/extending_cms/fields.html

from django.db import models
from cms.models.fields import PageField

class MyModel(models.Model):
    my_page = PageField()

如果您想通过它的reverse_id获取网页的网址,则需要使用以下内容

Page.objects.public().get(reverse_id='update').get_absolute_url()