2011-10-27 55 views
0

我正在將一個WordPress站點轉換爲一個Django。我需要保留舊帖子的網址結構,但對於新帖子有不同的結構。使用基於類的通用視圖將多個URL特殊處理爲一個視圖

urls.py

url(r'^reviews/archives/(?P<pk>\d+)$', PostDetail.as_view(), name="oldpost_view"), 

帖子/ urls.py

url(r'^(?P<slug>[-\w]+)$', PostDetail.as_view(), name="post_view"), 
:我創建了2個網址,settings.py中設置一個日期,然後設置絕對URL像這樣做到了這一點

帖/ models.py

@property   
def is_old_post(self): 
    wp_date = settings.WP_ARCHIVE_DATE 
    if self.post_date.date() < wp_date: 
     return True 
    # return False 

@models.permalink  
def get_abs_url(self): 
    if self.is_old_post: 
     return ('oldpost_view',(), { 
      'pk': self.id, 
      } 
     ) 
    else: 
     return ('post_view', [str(self.url_slug)]) 

我使用一個視圖爲2個網址:

class PostDetail(DetailView): 
    model = Post 
    slug_field = 'url_slug' 
    template_name = "posts/detail.html" 

這一切都很好。現在,我需要的是防止新帖被oldpost_view url渲染,反之亦然。我知道我可以覆蓋「get」並使用reverse,但是我怎麼知道請求來自哪個url?什麼是最有效和乾燥的方式來做到這一點?

+0

首先,你說你的網址鏈接到相同的視圖,然後你說不同類型的網址應該由不同的視圖呈現。所以答案很明顯。只是用不同的觀點來處理它們。 – akonsu

+3

你真正想要做的是從舊的到新的重定向。您不需要兩個相同內容的網址。如果你做永久重定向(301狀態碼),幾乎每個客戶都會認識到這一點。 –

+0

+ Issac評論的數百萬。 –

回答

0

基於Issac Kelly的反饋,我能夠解決我的問題。下面是更新的觀點:

class PostDetail(DetailView): 
    model = Post 
    slug_field = 'post_name' 
    template_name = "posts/detail.html" 

def OldPostView(request, pk): 
    post_name = get_object_or_404(Post, pk=pk).post_name 
    return redirect('post_view', slug=post_name, permanent=True) 

我也更新我的模型,利用該WordPress的有「POST_NAME」字段,然後簡化我的永久鏈接:

@models.permalink  
def get_abs_url(self): 
    return ('post_view', [str(self.post_name)]) 

感謝伊薩克!

1

如果你不按我的「301」的狀態上面的代碼的建議,這裏是我會怎麼做:如果日期是前

  1. 覆蓋上的DetailView
  2. get方法CUTOFF_DATE和request.path [:10]!=「reviews/arc」 - >重定向(301)
  3. elseif日期在CUTOFF_DATE和request.path [:10] ==「reviews/arc」 - >重定向

大致類似的東西。

相關問題