0

我正在将 WordPress 网站转换为 django 网站。我需要为旧帖子保留 url 结构,但对新帖子有不同的结构。我通过创建 2 个 url,在 settings.py 中设置日期,然后像这样设置绝对 url 来做到这一点:

网址.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"),

帖子/模型.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 个 url 使用一个视图:

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

这一切都很好。现在,我需要防止 oldpost_view url 呈现新帖子,反之亦然。我知道我可以覆盖“get”并为此使用反向,但我如何判断请求来自哪个 url?最有效和最干燥的方法是什么?

4

2 回答 2

1

如果您不按照我的建议使用上面的“301”状态码,我会这样做:

  1. 覆盖 DetailView 上的 get 方法
  2. 如果日期早于 CUTOFF_DATE,并且 request.path[:10] != "reviews/arc" --> 重定向 (301)
  3. elseif 日期在 CUTOFF_DATE 和 request.path[:10] == "reviews/arc" --> 重定向之后

大概是这样的东西。

于 2011-10-27T04:40:57.587 回答
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)])

谢谢伊萨克!

于 2011-10-28T08:15:39.713 回答