0

这是我在 django (1.4) 中使用基于类的视图完成的第一个项目,我在基于日期的存档不返回 URL 时遇到了一些问题。我已经成功地在我的项目(企业内部网)中构建了几个不需要它们的应用程序,但该站点的“新闻”部分确实需要基于日期的存档。

年月日档案似乎都可以正常工作,但我的个人文章并没有产生我认为应该的 URL。我很确定问题出在 models.py 中的 get_absolute_url 函数中,因为如果我键入 URL,我希望他们直接拥有 django 会找到并显示我想要的文章!

从我得到的外壳调用 get_absolute_url 函数:

NoReverseMatch: Reverse for 'news_detail' with arguments '('2013', 'Jan', '14', 'another-news-thang')' and keyword arguments '{}' not found.

我已经阅读了DateDetailView的相关文档和具体参考,但我无法完全理解我出错的地方。

我的models.py是:

from django.db import models
import datetime
from django.core.urlresolvers import reverse
from django.contrib.auth.models import User
from phone_list.models import Person, Team
from tinymce import models as tinymce_models
from taggit.managers import TaggableManager
from easy_thumbnails.fields import ThumbnailerImageField

class LiveNewsManager(models.Manager):
    def get_query_set(self):
        return super(LiveNewsManager, self).get_query_set().filter(status=self.model.LIVE_STATUS)

class News(models.Model):
    LIVE_STATUS=1
    DRAFT_STATUS=2
    HIDDEN_STATUS=3
    STATUS_CHOICES=(
        (LIVE_STATUS, 'Live'),
        (DRAFT_STATUS, 'Draft'),
        (HIDDEN_STATUS, 'Hidden'),
    )

    # core fields
    headline=models.CharField(max_length=250)
    image = ThumbnailerImageField(
        upload_to='news_images',
        resize_source=dict(size=(700, 500), sharpen=True),
        null=True,
        blank=True,
        help_text = "Optional. Photographs added here are given 'feature' status and should be landscape oriented.",
    )
    image_caption=models.CharField(
        max_length=144,
        blank=True,
        help_text = "DO NOT ADD IF THERE IS NO FEATURE IMAGE",
    )
    story = tinymce_models.HTMLField()
    pub_date=models.DateTimeField(default=datetime.datetime.now)

    # metadata
    writer=models.ForeignKey(Person)
    enable_comments=models.BooleanField(default=True)
    featured=models.BooleanField(default=False)
    slug=models.SlugField(unique_for_date='pub_date')
    status=models.IntegerField(choices=STATUS_CHOICES, default=LIVE_STATUS)

    # categorization
    tags=TaggableManager()

    objects=models.Manager()
    live=LiveNewsManager()

    class Meta:
        verbose_name_plural='News articles'
        ordering=['-pub_date']

    def pictures(self):
        try:
            return [self.image]
        except:
            pass

    def get_absolute_url(self):
        return reverse ('news_detail', args = [str(self.pub_date.strftime("%Y")), str(self.pub_date.strftime("%b")), str(self.pub_date.strftime("%d")), str(self.slug)])

    def __unicode__(self):
        return self.headline

我的 urls.py 是:

from django.conf.urls import patterns, include, url
from haystack.forms import ModelSearchForm
from haystack.query import SearchQuerySet
from haystack.views import SearchView
from django.views.generic import ArchiveIndexView, YearArchiveView, MonthArchiveView, DayArchiveView, DateDetailView
from datetime import date
from news.models import News

sqs = SearchQuerySet().models(News)

urlpatterns = patterns('',
    url(r'^$', ArchiveIndexView.as_view(
        date_field = 'pub_date',
        model=News,
        context_object_name="latest_news",),
        ),
    url(r'^(?P<year>\d{4})/$', YearArchiveView.as_view(
        date_field = 'pub_date',
        model=News,
        context_object_name="year_archive",),
        ),
    url(r'^(?P<year>\d{4})/(?P<month>\w{3})/$', MonthArchiveView.as_view(
        date_field = 'pub_date',
        model=News,
        context_object_name="month_archive",),
        ),
    url(r'^(?P<year>\d{4})/(?P<month>\w{3})/(?P<day>\d{2})/$', DayArchiveView.as_view(
        date_field = 'pub_date',
        model=News,
        context_object_name="day_archive",),
        ),
    url(r'^(?P<year>\d{4})/(?P<month>\w{3})/(?P<day>\d{2})/(?P<slug>[-\w]+)/$', DateDetailView.as_view(
        date_field = 'pub_date',
        model=News,
        context_object_name="news_detail",),
        ),
    url(r'^search/$', SearchView(
        template='news/search.html',
        searchqueryset=sqs,
    ), name='haystack_search'),
)

抱歉代码有点乱;一旦我让它们工作,我倾向于清理它们。非常感谢任何帮助。

4

1 回答 1

3

您在这里没有任何地方命名您的 URL。

news_detail如果尚未在某处定义,则无法反转。

   url(r'^(?P<year>\d{4})/(?P<month>\w{3})/(?P<day>\d{2})/(?P<slug>[-\w]+)/$',       
      DateDetailView.as_view(
        date_field = 'pub_date',
        model=News,
        context_object_name="news_detail",),
        ),
       name='news_detail'),  #<--- you're missing this
于 2013-01-14T22:47:58.650 回答