Внешний ключ 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.

Теперь, когда я обновился, прошел и нажал «опубликовать черновик» на всех своих страницах, на той же странице администратора отображаются две копии каждой страницы в поле выбора — одна опубликованная и одна черновая.

Некоторое дальнейшее расследование показало, что в определение тизерного плагина добавлено следующее: справиться с этим:

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


person Racing Tadpole    schedule 26.05.2013    source источник


Ответы (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()

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

Page.objects.public().get(reverse_id='update').get_absolute_url()
person Venelin Stoykov    schedule 08.11.2013
comment
Еще вопрос - знаете ли вы, обрабатывает ли это несколько сайтов для меня, или мне нужно использовать: Page.objects.public().get(reverse_id='update', site=get_current_site(request)).get_absolute_url() ? - person Racing Tadpole; 17.11.2013
comment
Как я вижу в коде нужно указать site если вы используете один и тот же reverse_id для разных страниц на разных сайтах. Также для более подробной информации вы можете увидеть код тега шаблона {% page_id_url %} github.com/divio/django-cms/blob/develop/cms/templatetags/ - person Venelin Stoykov; 09.12.2013