2013-01-14 2 views
0

이것은 장고 (1.4)에서 클래스 기반 뷰를 사용한 첫 번째 프로젝트이며 URL을 반환하지 않는 날짜 기반 아카이브에 약간의 문제가 있습니다. 필자는 프로젝트가 필요없는 회사의 인트라넷에 몇 가지 앱을 성공적으로 만들었지 만 사이트의 '뉴스'부분에는 실제로 날짜 기반 아카이브가 필요합니다.URL 및 django 클래스 기반 뷰

년, 월 및 일 아카이브는 모두 정상적으로 작동하지만 내 개별 기사는 내가 생각하는 URL을 생성하지 않습니다. 나는 확실히 내가 문제가 모델 get.py 내에서 get_absolute_url 함수에 있다고 확신하기 때문에 URL을 입력하면 직접 원하는 장고를 찾고 표시 할 수 있기를 원하기 때문이다! 내가 얻을 쉘에서

호출 get_absolute_url 기능 :

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

나는 relevant docs 읽고 DateDetailView에 대한 특정 참조하지만 잘못된거야 어디 아주 내 머리 라운드를 얻을 수 없다했습니다.

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는 다음과 같습니다 :

내 models.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

여기에 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 
+0

완벽하기 때문에 나는 이런 식으로 간단 할 것임을 알았습니다. 감사. –

관련 문제