Как исправить ошибку Django Sitemap: объект 'str' не вызывается при использовании @cached_property - PullRequest
0 голосов
/ 10 марта 2019

Я пытаюсь добавить файлы Sitemap на свой сайт django, и у меня возникли проблемы, Вот обратная связь:

Internal Server Error: /sitemap.xml
Traceback (most recent call last):
  File "C:\ProgramData\Anaconda3\lib\site-packages\django\core\handlers\exception.py", line 34, in inner
    response = get_response(request)
  File "C:\ProgramData\Anaconda3\lib\site-packages\django\core\handlers\base.py", line 126, in _get_response
    response = self.process_exception_by_middleware(e, request)

  File "C:\ProgramData\Anaconda3\lib\site-packages\django\core\handlers\base.py", line 124, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "C:\ProgramData\Anaconda3\lib\site-packages\django\contrib\sitemaps\views.py", line 16, in inner
    response = func(request, *args, **kwargs)
  File "C:\ProgramData\Anaconda3\lib\site-packages\django\contrib\sitemaps\views.py", line 71, in sitemap
    protocol=req_protocol))
  File "C:\ProgramData\Anaconda3\lib\site-packages\django\contrib\sitemaps\__init__.py", line 111, in get_urls
    urls = self._urls(page, protocol, domain)
  File "C:\ProgramData\Anaconda3\lib\site-packages\django\contrib\sitemaps\__init__.py", line 120, in _urls
    loc = "%s://%s%s" % (protocol, domain, self.__get('location', item))
  File "C:\ProgramData\Anaconda3\lib\site-packages\django\contrib\sitemaps\__init__.py", line 68, in __get
    return attr(obj)
  File "C:\ProgramData\Anaconda3\lib\site-packages\django\contrib\sitemaps\__init__.py", line 75, in location
    return obj.get_absolute_url()
TypeError: 'str' object is not callable

Это происходит потому, что я использовал свойство @cached в методе get_absolute_url () модели, используемой для карт сайта.

Метод в модели:

@cached_property
def get_absolute_url(self):
    return reverse('person', args=[self.slug])

В urls.py

sitemaps = {
    'people': GenericSitemap({
        'queryset': Person.objects.all()
    }, priority=0.4, changefreq='weekly'),
}

urlpatterns = [
    path('sitemap.xml', sitemap, {'sitemaps': sitemaps}, name='django.contrib.sitemaps.views.sitemap'),
]

Когда я удаляю cached_property, он работает должным образом, но я не хочу удалять декоратор, потому что я думаю, что это помогает уменьшить количество обратных ссылок, разве нет другого варианта?

РЕДАКТИРОВАТЬ : я вызываю этот get_absolute_url из множества мест в шаблоне и много раз, как при создании списка людей и тому подобное, чтобы получить его ссылку. Поэтому я начал использовать @cached_property для кеширования, чтобы сократить время.

...