2013-05-26 1 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}, 
     ...) 

Кроме того, я использовал, чтобы иметь возможность просмотра страниц 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_to, а дополнительное поле в get теперь необходимо? Или есть более чистый способ видеть только опубликованные страницы? (Например, я замечаю, что другие CMS плагины, например, ссылка, изображение, использовать внешние ключи без limit_choices_to аргумента.)

ответ

5

Для лучшей обработки внешних ключей К страниц вам нужно использовать 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() 

Если вы хотите, чтобы получить URL для страницы, это reverse_id вам нужно использовать следующие

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

Очень полезно - т мотки! –

+0

Еще один вопрос: знаете ли вы, что для этого используется несколько сайтов, или мне нужно использовать: 'Page.objects.public(). Get (reverse_id = 'update', site = get_current_site (request)) get_absolute_url () '? –

+0

Как я вижу в коде, вам нужно указать 'site', если вы используете один и тот же' reverse_id' для разных страниц на разных сайтах. Также для получения более подробной информации вы можете увидеть код шаблона '{% page_id_url%}' https://github.com/divio/django-cms/blob/develop/cms/templatetags/cms_tags.py#L111 –