鉴于此应用程序:
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)
...
是否可以在例如文章的方法中引用由 apphook 关联的页面?
从模型方面,我已经得到了
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 知道页面的 apphook 可以通过
page.application_urls
访问,这给了我 'u'NewsHook'
。但我缺少一个链接。
我想我可以通过 application_urls 字段过滤页面并寻找与我的
article._meta.app_config.verbose_name
匹配,但这既不安全也不漂亮。有更好的方法吗?
最佳答案
我知道这个问题已经有一年了,可能 OP 已经弄清楚了,但是我遇到了类似的问题,我通过直接在方法上引用 apphook 来解决这个问题。
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()
我更进一步,创建了一个模板标签,它使用 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 %}
关于python - django-cms:如何从与其关联的应用程序中获取页面,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35346334/