我最近从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)
Run Code Online (Sandbox Code Playgroud)
在管理员中,这将很好地允许我选择要关联的页面MyModel.
现在我已经升级,并在我的所有页面上按下"发布草稿",同一管理页面在其选择框中显示每个页面的两个副本 - 一个已发布,一个草稿.
一些进一步的调查发现,teaser插件在其定义中添加了以下内容来处理:
page_link = models.ForeignKey(Page,
limit_choices_to={'publisher_is_draft': True},
...)
Run Code Online (Sandbox Code Playgroud)
同样,我曾经能够在我的视图中查找页面URL,如下所示:
Page.objects.get(reverse_id='update').get_absolute_url()
Run Code Online (Sandbox Code Playgroud)
但现在我必须使用:
Page.objects.get(reverse_id='update', publisher_is_draft=False).get_absolute_url()
Run Code Online (Sandbox Code Playgroud)
这看起来有点难看.
是limit_choices_to和额外的领域中get,现在有必要吗?或者是否有更简洁的方式来查看已发布的页面?(例如,我注意到其他cms插件,例如链接,图片,使用没有limit_choices_to参数的外键.)
小智 6
为了更好地处理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()
Run Code Online (Sandbox Code Playgroud)
当你想通过它的reverse_id来获取页面的url时,你需要使用以下内容
Page.objects.public().get(reverse_id='update').get_absolute_url()
Run Code Online (Sandbox Code Playgroud)