0

WordPress サイトを django サイトに変換しています。古い投稿の URL 構造を保持する必要がありますが、新しい投稿の構造は異なります。これを行うには、2 つの URL を作成し、settings.py で日付を設定してから、次のように絶対 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"),

投稿/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 つの URL に対して 1 つのビューを使用しています。

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

これはすべてうまくいきます。ここで必要なのは、新しい投稿が oldpost_view url によってレンダリングされないようにすることです。「get」をオーバーライドしてこれを逆に使用できることはわかっていますが、リクエストがどのURLから来たかをどのように確認できますか? これを行うための最も効率的で DRY な方法は何ですか?

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 に答える