【问题标题】:Django get_absolute_url always throwing a 404Django get_absolute_url 总是抛出 404
【发布时间】:2016-03-30 00:14:48
【问题描述】:

我正在构建一个 Django 项目 (1.8),但在使用我的一个模型的 get_absolute_url 方法时遇到问题。我用一些帖子填充了我的数据库,所以我可以检查我的应用程序。我能够在我的一个视图中列出数据库对象,所以我知道对象在那里,并且我的应用程序可以显示它们。当我点击一个链接时问题就来了,并且视图总是返回一个 404(基本上它找不到要显示的对象)

以下是此应用程序的大部分代码。我试图将我的导入包含在这些 sn-ps 中,但为了保持帖子简短而截断了其中的一些。

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/

我在这个问题上花费了过多的时间,这可能需要花费几分钟来解决。提前致谢。

【问题讨论】:

  • 尝试使用管理站点查看我网站上的对象也抛出了 404 错误
  • 您的 get_absolute_url 方法正在将参数传递给 reverse,但您的 url 模式使用了 keyword 参数。
  • 我最终将 get_absolute_url 函数更改为不采用月、年和日,这最终奏效了。我对这些争论的语法可能是错误的,或者我的模型无法识别它们。

标签: django templates url views


【解决方案1】:

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

【讨论】:

  • 是的,先生。这是我开始制作模型之前做的第一件事。
【解决方案2】:

如果您使用与 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

【讨论】:

    【解决方案3】:

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

    • 发帖

    但您对reverse 的调用将这些值作为位置 参数(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
            })
    

    【讨论】:

    • 我尝试使用关键字参数 (kwargs) 与位置参数 (args),但我仍然得到 404。仅供参考,我没有投反对票。
    • kwargs 更改绝对是必需的。如果这不起作用,请检查您是否能够通过单元测试调用 reverse,或者通过从 ORM 返回一个对象并检查该方法是否返回一个值来手动调用。可能是其中一个值与模式不匹配,也可能是另一个 URL 模式无意中踩到了这个模式。
    • 遗憾的是,我已经尝试了大约 4 种代码变体,但仍然因为尝试获取对象而得到 404。我使用 args 还是 kwargs 似乎并不重要。我检查了其他 URL 模式,但在那里看不到任何问题(我只有 URL conf 文件和此处列出的那个。我检查了手动编码 ORM 并且我的 get_absolute_url 没有返回任何内容,给出与以前相同的错误。
    • 尝试更改视图以仅检索对象而不使用get_object_or_404。这消除了一种自动行为,并可能揭示视图无法返回对象的原因。
    • 每次不同的尝试都会导致这种类型的错误:“valuefact_detail”与参数“()”和关键字参数“{'pk':2}”相反。尝试了 0 个模式: [] 。争论是什么似乎并不重要,它总是找不到匹配的模式。
    猜你喜欢
    • 2020-08-26
    • 2023-03-28
    • 1970-01-01
    • 2011-02-08
    • 1970-01-01
    • 1970-01-01
    • 2011-01-13
    • 2011-02-18
    • 1970-01-01
    相关资源
    最近更新 更多