【问题标题】:Django-CMS foreign key on pages showing published and draft pages显示已发布页面和草稿页面的页面上的 Django-CMS 外键
【发布时间】:2013-05-21 19:23:40
【问题描述】:

我最近从 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},
        ...)

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

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

但现在我必须使用:

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

这看起来有点难看。

现在需要limit_choices_toget 中的额外字段吗?还是有一种更简洁的方法来只查看已发布的页面? (例如,我注意到其他 cms 插件,例如链接、图片,使用没有 limit_choices_to 参数的外键。)

【问题讨论】:

    标签: django django-cms


    【解决方案1】:

    为了更好地处理 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 获取页面的 url 时,您需要使用以下内容

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

    【讨论】:

    • 另一个问题 - 你知道这是否为我处理多个网站,还是我需要使用:Page.objects.public().get(reverse_id='update', site=get_current_site(request)).get_absolute_url()
    • 正如我在代码中看到的,如果您对不同站点的不同页面使用相同的reverse_id,则需要指定site。更多细节可以看{% page_id_url %}模板标签github.com/divio/django-cms/blob/develop/cms/templatetags/…的代码
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-20
    相关资源
    最近更新 更多