Ошибка фида Django: у объекта 'function' нет атрибута 'setswith'

Я работаю с Django 1.8 и пытаюсь создать простой канал для своего проекта. Вот файл feeds.py, который создает канал:

from django.contrib.syndication.views import Feed
from django.template.defaultfilters import truncatewords
from valueFact.models import ValueFactPost


class LatestPostsFeed(Feed):
    title = "Contributions from members"
    link = "/companies/"
    description = "New Contributions by members"

    def items(self):
        return ValueFactPost.published.all()[:5]

    def item_title(self, item):
        return item.title

    def item_description(self, item):
        return truncatewords(item.body, 30)

Мой файл url.py приложения выглядит следующим образом:

from django.conf.urls import url

from valueFact import views
from valueFact.feeds import LatestPostsFeed


urlpatterns = [
    url(r'^$',
        views.valueFactListView.as_view(),
        name='valueFact_list'),
    url(r'^(?P<year>\d{4})/(?P<post>[-\w]+)/$',
        views.valuefact_detail,
        name='valuefact_detail'),
    url(r'^(?P<fact_id>\d+)/share/$',
        views.valuefact_share,
        name='valuefact_share'),
    url(r'^feed/$', LatestPostsFeed(), name='post_feed'),
]

Я направляю браузер на URL "companies/feed" и получаю следующую ошибку. Обратите внимание, что я уже включил URL всех этих приложений в файл conf основных проектов, и он работает нормально (например, я получаю нужную страницу, когда набираю 127.0.0.1:8000/companies)

Редактировать: вот полный след

Environment:


Request Method: GET Request URL: http://127.0.0.1:8000/companies/feed/

Django Version: 1.8 Python Version: 3.5.0 Installed Applications: ('django.contrib.auth',  'django.contrib.contenttypes',  'django.contrib.sessions',  'django.contrib.messages',  'django.contrib.staticfiles',  'django.contrib.admin',  'django.contrib.sites',  'django.contrib.sitemaps',  'djangobower',  'rest_framework',  'stockData',  'accounts',  'functional_tests',  'valueFact') Installed Middleware: ('django.contrib.sessions.middleware.SessionMiddleware',  'django.middleware.common.CommonMiddleware',  'django.middleware.csrf.CsrfViewMiddleware',  'django.contrib.auth.middleware.AuthenticationMiddleware',  'django.contrib.auth.middleware.SessionAuthenticationMiddleware',  'django.contrib.messages.middleware.MessageMiddleware',  'django.middleware.clickjacking.XFrameOptionsMiddleware',  'django.middleware.security.SecurityMiddleware')


Traceback: File "/Users/djunh/Programming/viex/virtualenv/lib/python3.5/site-packages/django/core/handlers/base.py" in get_response
  132.                     response = wrapped_callback(request, *callback_args, **callback_kwargs) File "/Users/djunh/Programming/viex/virtualenv/lib/python3.5/site-packages/django/contrib/syndication/views.py" in __call__
  43.         feedgen = self.get_feed(obj, request) File "/Users/djunh/Programming/viex/virtualenv/lib/python3.5/site-packages/django/contrib/syndication/views.py" in get_feed
  174.                 request.is_secure(), File "/Users/djunh/Programming/viex/virtualenv/lib/python3.5/site-packages/django/contrib/syndication/views.py" in add_domain
  19.     if url.startswith('//'):

Exception Type: AttributeError at /companies/feed/ Exception Value: 'function' object has no attribute 'startswith'

Заранее спасибо!

1 ответ

Если вы не определите get_absolute_url(self) на вашей модели вам может понадобиться определить item_link

# item_link is only needed if NewsItem has no get_absolute_url method.
def item_link(self, item):
    return reverse('news-item', args=[item.pk])

Из документов:

Чтобы указать содержание <link>У вас есть два варианта. Для каждого элемента в items () Django сначала пытается вызвать метод item_link() класса Feed. Подобно заголовку и описанию, ему передается единственный параметр item. Если этот метод не существует, Django пытается выполнить метод get_absolute_url() для этого объекта. И get_absolute_url(), и item_link() должны возвращать URL элемента в виде обычной строки Python. Как и в случае с get_absolute_url(), результат item_link() будет включен непосредственно в URL, поэтому вы несете ответственность за выполнение всех необходимых ссылок на URL и преобразование в ASCII внутри самого метода.

Другие вопросы по тегам