2013-05-26 41 views
3

我最近從Django的CMS 2.3.5升級到2.4.1。網頁上的Django-CMS外鍵顯示和公佈草案頁

以前我有像這樣的模型:

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

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

在管理,這將很好地讓我選擇一個頁面與MyModel關聯。

現在,我已經升級,並通過了與壓在我的所有網頁「發佈稿」,在同一個管理頁面顯示的選擇框的每個頁面的兩個副本 - 一個發佈和一個草案。

一些further investigation已發現了傳情插件已經在其定義下面加來處理這個:

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() 

這看起來有點難看。

是在getlimit_choices_to和額外的字段現在有必要嗎?或者有更簡潔的方式只看到發佈的頁面? (例如,我注意到,其他CMS的插件,例如鏈接,圖片,使用外鍵沒有limit_choices_to參數)。

回答

5

爲了更好地處理外鍵的CMS的頁面,你需要使用的,而不是ForeignKey的

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

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

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

如果你想獲得的URL的網頁通過它reverse_id你需要使用下面的

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

非常有用 - T的漢克斯! –

+0

另一個問題 - 你知道這是否處理多個站點對我來說,還是需要使用方法:'Page.objects.public()得到(reverse_id =「更新」,網站= get_current_site(要求))get_absolute_url( )'? –

+0

正如我在代碼中看到的那樣,如果您在不同網站的不同頁面中使用相同的'reverse_id',則需要指定'site'。 也爲更多的細節,你可以看到'代碼{%page_id_url%}'模板標籤https://github.com/divio/django-cms/blob/develop/cms/templatetags/cms_tags.py#L111 –