我正在构建一个 Django 项目(1.8),但在使用我的一个模型的 get_absolute_url 方法时遇到了问题。我用一些帖子填充了我的数据库,所以我可以检查我的应用程序。我能够在我的一个视图中列出数据库对象,所以我知道对象在那里,我的应用程序可以显示它们。当我点击链接时,问题就来了,视图总是返回 404(基本上找不到要显示的对象)
以下是此应用程序的大部分代码。我试图将我的导入包含在这些片段中,但截断了其中的一些以保持帖子简短。
valueFact/models.py
class ValueFactPost(models.Model):
STATUS_CHOICE = (
('draft', 'Draft'),
('published', 'Published')
)
title = models.CharField(max_length=250)
slug = models.SlugField(max_length=250, unique_for_date='publish')
author = models.ForeignKey(User, related_name='valueFact_posts')
publish = models.DateTimeField(default=timezone.now)
body = models.TextField()
created = models.DateTimeField(auto_now_add=True)
updated = models.DateTimeField(auto_now=True)
status = models.CharField(max_length=10,
choices=STATUS_CHOICE,
default='draft')
stockSymbol = models.ForeignKey('Symbol', null=True )
objects = models.Manager()
published = ValueFactManager()
def get_absolute_url(self):
return reverse('companies:valuefact_detail', args=[self.publish.year,
self.publish.strftime('%m'),
self.publish.strftime('%d'),
self.slug])
urls.py
from django.conf.urls import include, url
urlpatterns = [
url(r'^admin/', include(admin.site.urls)),
url(r'^companies/', include('valueFact.urls', namespace='companies', app_name='companies')),
]
valueFact/urls.py
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^$', views.valueFactListView.as_view(), name='valueFact_list'),
url(r'^(?P<year>\d{4})/(?P<month>\d{2})/(?P<day>\d{2})/(?P<post>[-\w]+)/$',
views.valuefact_detail,
name='valuefact_detail'),
]
valueFact/views.py
from django.shortcuts import render, get_object_or_404, render_to_response
from valueFact.models import ValueFactPost, Symbol
class valueFactListView(ListView):
queryset = ValueFactPost.published.all()
context_object_name = 'valueFacts'
paginate_by = 2
template_name = 'companies/valueFact/list.html'
def valuefact_detail(request, year, month, day, post):
post = get_object_or_404(ValueFactPost, slug=post,
status='published',
publish__year=year,
publish__month=month,
publish__day=day)
return render(request, 'companies/valuefact/detail.html', {'post':post})
出现问题的模板:
list.html
{% for post in valueFacts %}
<a href="{{ post.get_absolute_url }}">
{{ post.title}}
</a>
</h2>
<p class="date">
Published {{post.publish}} by {{post.author}}
</p>
{{post.body|truncatewords:30|linebreaks}}
{% endfor %}**
django控制台报错:Not Found: /companies/2016/03/23/seadrill-debt/
我在这个问题上花费了过多的时间,可能需要几分钟才能解决。提前致谢。
你有安装 PYTZ 吗?我不能保证这是答案,但值得一试。我没有发现代码有任何问题,因为我在一个项目中使用了几乎相同的代码。
如果您使用与 UTC 不同的时区,当一个对象被保存时,
publish
属性可能与您使用 UTC 时区时不同。
如果是这种情况,您的 get_absolute_url 方法必须返回
localtime
版本的 publish
.
在你的
models.py
中,考虑这样写
def get_absolute_url(self):
"""
Get single object.
year, month, day, and slug order.
"""
# convert to Asia/seoul time
localdatetime = timezone.localtime(self.publish)
return reverse(
"blog:post_detail",
args=[
localdatetime.year,
localdatetime.month,
localdatetime.day,
self.slug,
],
)
SO 有other similar post about this.
方法一: 不要使用
DateTimeField
在您的模型中使用 DateField
问题将得到解决。
# models.py
class Post(models.Model):
publish = models.DateField(default=timezone.now)
created = models.DateField(auto_now_add=True)
updated = models.DateField(auto_now=True)
方法二:覆盖
get_object
您的网址模式建立了 4 个关键字参数:
但是您对
reverse
的调用将这些值作为 positional 参数(args)传递,这是一个列表。相反,将它们作为 keyword 参数(kwargs)传递,这是一个字典:
def get_absolute_url(self):
return reverse('companies:valuefact_detail', args=[],
kwargs={
'year':self.publish.year,
'month': self.publish.strftime('%m'),
'day': self.publish.strftime('%d'),
'post': self.slug
})