用于Elasticsearch的Django CMS绝对URL

时间:2016-08-31 08:17:31

标签: python django elasticsearch django-cms

我为django app写了一个命令:

for p in Article.public.all():
    data += '{"index": {"_id": "%s", "_type": "article"}}\n' % p.pk
    data += json.dumps({
        "title": p.title,
        "category": p.category.category,
        "content_type": p.content_type,
        "duration": p.get_audio_duration(),
        "thumbnail": p.get_thumbnail(),
        "date": datetime.strftime(p.date, '%d.%m.%Y'),
        "url": p.get_absolute_url(),
        "content": p.content
    }) + '\n'

response = requests.put('{}/radio_index/_bulk'.format(settings.ES_URL), data=data)

get_absolute_url方法如下所示:

    def get_absolute_url(self):
        return reverse('tv_article_hook:article_tv_detail', kwargs={'slug': self.slug})

我正在使用Django CMS apphooks。 Apphook网址是:

urlpatterns = patterns('', 
                       url(r'^$', ArticleTvListView.as_view(), name='article_tv_list'),
                       url(r'^(?P<slug>[^/]+)/$', ArticleTvView.as_view(), name='article_tv_detail')
                   )

当我在模板或REST api中使用get_absolute_url时,它可以正常工作。但当我通过manage.py feed_index代码运行命令失败p.get_absolute_url时出现错误:

django.core.urlresolvers.NoReverseMatch: Reverse for 'article_tv_detail' with arguments '()' and keyword arguments '{'slug': 'some slug'}' not found. 0 pattern(s) tried: []

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

您需要确保Django本身(而不仅仅是CMS)知道应用程序的命名空间tv_article_hook

我怀疑它是在CMS注册的,但不是Django知道的命名空间。现在,根据您使用的Django版本,有两种方法可以为Django定义命名空间。但请阅读application docs,基本上您可以像这样定义自己的应用配置;

# tv_article/__init__.py

default_app_config = 'tv_article.apps.TVArticleConfig'

# tv_article/apps.py

from django.apps import AppConfig

class TVArticleConfig(AppConfig):
    name = 'tv_article'
    verbose_name = "TV Article"

使用该设置,您应该能够像这样修改代码(从CMS命名空间中移除&#39; _hook&#39;因为这是CMS术语,但我们只是在谈论一个Django应用程序在这里);

def get_absolute_url(self):
    return reverse('tv_article:article_tv_detail', kwargs={'slug': self.slug})