2016-02-11 1 views
4

Учитывая это apphook:Джанго-КМВ: как получить страницу из приложения, связанного с ним

class NewsHook(CMSApp): 
    name = _("News") 
    urls = ["apps.news.urls"] 

apphook_pool.register(NewsHook) 

и эту модель внутри apps.news.models:

class Article(models.Model): 
    title = models.CharField(max_length=255) 
    ... 

Можно ли ссылаться на страницу, связанную например, по методу «Article»?

Со стороны модели я получил, насколько article._meta.app_label или article._meta.app_config.verbose_name, но это дает лишь 'news' и 'News' соответственно.

И я знаю от https://github.com/divio/django-cms/blob/7888ab8421bb836c8f7a1127d9a2bf4d4bbdf23e/cms/models/pagemodel.py#L82, что аптека для страницы доступна с page.application_urls, что дает мне 'u'NewsHook'.

Но у меня отсутствует ссылка.

Я полагаю, что я мог бы фильтровать страницы по полю application_urls и искать совпадение с моим article._meta.app_config.verbose_name, но это не было бы ни отказоустойчивым, ни красивым.

Любые идеи для лучшего способа?

ответ

0

Я знаю, что этот вопрос - год, и, вероятно, ОП выяснили это, но у меня была аналогичная проблема, которую я решил, обратившись к аппроксимации непосредственно по методу.

from applications.cms_apps import ApplicationAppHook 
from cms.models.pagemodel import Page 

class Application(models.Model): 
    def related_cms_page(self): 
     return Page.objects.filter(application_namespace=ApplicationAppHook.app_name).public().first() 

Я пошел несколько дальше и создали templatetag, который использует значение application_namespace для загрузки страницы

from cms.models.pagemodel import Page 

@register.assignment_tag() 
def get_page_by_namespace(application_namespace_str): 
    try: 
     return Page.objects.filter(application_namespace=application_namespace_str).public().first() 
    except AttributeError: 
     # EAFP ;) 
     return None 

И на шаблоне:

{% get_page_by_namespace 'applications_apphook' as page %} 
{% if page %} 
    {{ page.get_menu_title }} 
    {# Official Django CMS templatetags also works in this instance, i.e. {% page_attribute "page_title" page %} but it seems a bit redundant to me #} 
{% endif %} 
Смежные вопросы