2013-01-14 252 views
0

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

年份,月份和日期档案似乎工作正常,但我个人的文章没有产生我认为他们应该的网址。我很确定问题出在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. 

我读过relevant docs并为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'), 
) 

对不起,稍显凌乱的代码;一旦我让他们工作,我倾向于清理它们。任何帮助非常感谢。

回答

3

你没有在这里命名你的网址。

如果尚未定义某处,则不能反转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 
+0

完美,我知道这将是这样简单的事情。谢谢。 –