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 に答える