【问题标题】:Django CMS 2.1.0 App Extension NoReverseMatch TemplateSyntaxErrorDjango CMS 2.1.0 应用扩展 NoReverseMatch TemplateSyntaxError
【发布时间】:2011-03-26 17:09:21
【问题描述】:

我正在为 Django CMS 编写一个自定义应用程序,但在尝试在管理员中查看已发布条目时出现以下错误:

/admin/cmsplugin_publisher/entry/ 处的模板语法错误

渲染时捕获 NoReverseMatch:“cmsplugin_publisher_entry_detail”的反向参数“()”和关键字参数“{'slug': u'test-german'}”未找到。

如果我在我的主应用程序 urls.py 中为应用程序提供一个 URL,我可以让应用程序工作,但这会将应用程序修复为所需的 URL,我只想扩展 Django CMS,以便应用程序来自它添加的任何页面到。

models.py 绝对 URL 模式

    @models.permalink
    def get_absolute_url(self):
        return ('cmsplugin_publisher_entry_detail', (), {
            'slug': self.slug})

urls/entries.py

from django.conf.urls.defaults import *
from cmsplugin_publisher.models import Entry
from cmsplugin_publisher.settings import PAGINATION, ALLOW_EMPTY, ALLOW_FUTURE

entry_conf_list = {'queryset': Entry.published.all(), 'paginate_by': PAGINATION,}

entry_conf = {'queryset': Entry.published.all(),
    'date_field': 'creation_date',
    'allow_empty': ALLOW_EMPTY,
    'allow_future': ALLOW_FUTURE,
}

entry_conf_detail = entry_conf.copy()
del entry_conf_detail['allow_empty']
del entry_conf_detail['allow_future']
del entry_conf_detail['date_field']
entry_conf_detail['queryset'] = Entry.objects.all()

urlpatterns = patterns('cmsplugin_publisher.views.entries',
    url(r'^$', 'entry_index', entry_conf_list,
        name='cmsplugin_publisher_entry_archive_index'),
    url(r'^(?P<page>[0-9]+)/$', 'entry_index', entry_conf_list,
        name='cmsplugin_publisher_entry_archive_index_paginated'),
)

urlpatterns += patterns('django.views.generic.list_detail',
    url(r'^(?P<slug>[-\w]+)/$', 'object_detail', entry_conf_detail,
        name='cmsplugin_publisher_entry_detail'),
)

views/entries.py

from django.views.generic.list_detail import object_list
from cmsplugin_publisher.models import Entry
from cmsplugin_publisher.views.decorators import update_queryset

entry_index = update_queryset(object_list, Entry.published.all)

views/decorators.py

def update_queryset(view, queryset, queryset_parameter='queryset'):
    '''Decorator around views based on a queryset passed in parameter which will force the update despite cache
    Related to issue http://code.djangoproject.com/ticket/8378'''

    def wrap(*args, **kwargs):
        '''Regenerate the queryset before passing it to the view.'''
        kwargs[queryset_parameter] = queryset()
        return view(*args, **kwargs)
    return wrap

这里解释了应用程序与 Django CMS 的集成:http://github.com/divio/django-cms/blob/master/cms/docs/app_integration.txt

看起来问题可能是我没有正确返回 RequestContext,因为我在应用程序中使用了错误的通用视图和自定义。

CMS 应用扩展 py 文件:

cms_app.py

from django.utils.translation import ugettext_lazy as _

from cms.app_base import CMSApp
from cms.apphook_pool import apphook_pool
from cmsplugin_publisher.settings import APP_MENUS

class PublisherApp(CMSApp):
    name = _('Publisher App Hook')
    urls = ['cmsplugin_publisher.urls']

apphook_pool.register(PublisherApp)

任何指针表示赞赏,事实证明这是一个难以破解的难题!

【问题讨论】:

    标签: python django django-cms


    【解决方案1】:

    看起来这是 Django-CMS 2.1.0beta3 中 URLconf 解析器中的一个错误,即fixed in dev。只有在应用程序中包含其他 URLconf 时才会出现该错误。

    【讨论】:

    • 完美解决了。谢谢杰森!
    【解决方案2】:

    更新:

    好的,我认为您的错误源自get_absolute_url

    @models.permalink
    def get_absolute_url(self):
        return ('cmsplugin_publisher_entry_detail', (), {'slug': self.slug})
    

    我怀疑这是因为这最终会调用object_detail,它需要一个位置参数queryset(参见django/views/generic/list_detail.py)。您可以尝试将其更改为:

        return ('cmsplugin_publisher_entry_detail', [Entry.objects.all(),], {'slug': self.slug})
    

    【讨论】:

    • 这没什么区别:slug_field 默认使用 'slug' - 这是模型的一部分。
    • 你是对的,没有注意到 slug_field 的默认值。我已经更新了我的答案。希望这会有所进展。
    • 我认为您对位置元素的看法是正确的,但是您的编辑提出了:渲染时捕获 ValueError:不要在调用 reverse() 时混合 *args 和 **kwargs!所以这个问题一定是在其他地方发生
    • 也许只是为 object_detail 创建一个包装函数,它接受两个位置参数(Entry.objects.all 和 self.slug),然后调用 object_detail。在 get_absolute_url 中指定该包装函数。如果这行得通,至少你会知道你在正确的轨道上。
    【解决方案3】:

    我会仔细检查 urls/entries.py 是否确实被导入到某个地方,否则它将无法获得反向匹配。

    【讨论】:

    • 好像不是,它在文件夹/urls/ 中通过init.py 导入entrys.py 文件夹中。当在主网站 urls.py 中为应用程序提供绝对 URL 时工作正常 - 当然我只想扩展 django-cms URL,所以这不是我可以使用的解决方案。
    猜你喜欢
    • 2011-05-07
    • 2013-05-26
    • 2015-09-17
    • 1970-01-01
    • 1970-01-01
    • 2014-06-24
    • 2014-11-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多