Специальная обработка нескольких URL в одном представлении с помощью базовых представлений на основе классов - PullRequest
0 голосов
/ 27 октября 2011

Я конвертирую сайт 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:

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

Все это прекрасно работает. Теперь мне нужно предотвратить рендеринг новых постов по ссылке oldpost_view и наоборот. Я знаю, что могу переопределить «get» и использовать reverse для этого, но как я могу определить, с какого URL пришел запрос? Какой самый эффективный и СУХОЙ способ сделать это?

Ответы [ 2 ]

1 голос
/ 27 октября 2011

Если вы не последуете моему совету с кодом статуса «301» выше, вот как я бы это сделал:

  1. Переопределить метод get в DetailView
  2. Если дата до CUTOFF_DATE и request.path [: 10]! = "Reviews / arc" -> Redirect (301)
  3. В противном случае дата после CUTOFF_DATE и request.path [: 10] == "reviews / arc" -> redirect

Что-то примерно так.

0 голосов
/ 28 октября 2011

Основываясь на отзывах Иссака Келли, я смог решить свою проблему.Вот обновленные представления:

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)

Я также обновил свои модели, чтобы использовать поле "post_name", которое есть в WordPress, а затем упростил мою постоянную ссылку:

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

Спасибо Issac!

...