2011-10-27 23 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” - >重定向

大致类似的东西。

相关问题