我正在使用Django 1.8,我正在尝试为我的项目创建一个简单的feed。以下是创建Feed的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)
我的app 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'),
]
我将浏览器定向到网址'companies / feed',并收到以下错误消息。请注意,我已经在主项目url conf文件中包含了所有这些应用程序URL,并且它正常工作(例如,当我输入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'
提前致谢!
答案 0 :(得分:0)
如果您未在模型上定义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])
来自docs:
要指定
<link>
的内容,您有两种选择。对于每个项目 在 items()中,Django首先尝试调用 item_link()方法 Feed 类。与标题和描述类似,它是 传递了一个参数 item 。如果该方法不存在, Django尝试在该对象上执行 get_absolute_url()方法。 get_absolute_url()和 item_link()都应该返回商品的网址 作为普通的Python字符串。与 get_absolute_url()一样,结果如下 item_link()将直接包含在网址中,您就是这样 负责做所有必要的URL引用和转换 方法本身内的ASCII。