Django get_absolute_url总是抛出一个404

wvt8vs2t  于 2023-02-25  发布在  Go
关注(0)|答案(4)|浏览(140)

我正在构建Django项目(1.8)并且我在使用我的一个模型的get_absolute_url方法时遇到了麻烦。我用一些帖子填充了我的数据库,这样我就可以检查我的应用程序。我能够在我的一个视图中列出数据库对象,这样我就知道对象在那里,我的应用程序可以显示它们。问题来了,当我点击一个链接时,视图总是返回404(基本上它找不到要显示的对象)
下面是这个应用程序的大部分代码,我试着在这些片段中包含我的导入,但是为了保持文章简短,我截断了一些。

价值事实/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])

网址.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')),

]

价值事实/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'),

]

价值事实/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})

似乎出现问题的模板:

列表.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控制台中的错误是:页面未找到:/companies/2016/03/23/海钻-债务/
我已经花了过多的时间在这个问题上,可能需要有人几分钟来解决。提前感谢。

nafvub8i

nafvub8i1#

你安装了PYTZ吗?我不能保证这就是答案,但值得一试。我没有看到代码有什么问题,因为我在一个项目中使用了几乎相同的代码。

kzmpq1sx

kzmpq1sx2#

如果使用的时区与UTC不同,则保存对象时,publish属性可能与使用UTC时区时的属性不同。
如果是这样的话,get_absolute_url方法必须返回publishlocaltime版本。
在您的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

3hvapo4f

3hvapo4f3#

**方法1:**在模型中使用DateField而不是DateTimeField,问题将得到解决。

# 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)

**方法2:**覆盖get_object

7uhlpewt

7uhlpewt4#

url模式建立了4个关键字参数:

  • 年份

但是你对reverse的调用将这些值作为 positional arguments(args)传入,这是一个列表,而将它们作为 keyword arguments(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
        })

相关问题