RedirectView дают NoReverseMatch - PullRequest
0 голосов
/ 27 марта 2019

Недавно Я изменил пути постов в блоге, чтобы дать более разборчивые URL.

До У меня есть эти пути:

path("category/<slug:slug_category>/", views.singleCategory_postList, name="single_category"),
path("<slug:slug_post>/", views.singlePost, name='single_blog_post'),

Теперь У меня есть это:

path("<slug:slug_category>/", views.singleCategory_postList, name="single_category"),
path("<slug:slug_category>/<slug:slug_post>/", views.singlePost, name='single_blog_post'),

Раньше get_absolute_url было так:

class Category(models.Model):
.....
    def get_absolute_url(self): 
        return reverse("single_category", kwargs={"slug_category": self.slug_category})


class BlogPost(ModelPost, TimeManager):
.....
    def get_absolute_url(self): 
        return reverse("single_blog_post", kwargs={"slug_post": self.slug_post})

Сейчас это:

class Category(models.Model):
.....
def get_absolute_url(self): 
    return reverse("single_category", kwargs={"slug_category": self.slug_category})


class BlogPost(ModelPost, TimeManager):
.....
def get_absolute_url(self): 
    return reverse("single_blog_post", kwargs={
                                            "slug_post": self.slug_post,
                                            "slug_category": self.category.slug_category,
                                            })

Я пытаюсь использовать RedirectView для перенаправления всех старых путей;затем в urls.py У меня есть это сейчас:

path("category/<slug:slug_category>/", RedirectView.as_view(pattern_name='single_category', permanent=True)),
path("<slug:slug_post>/", RedirectView.as_view(pattern_name='single_blog_post', permanent=True)),

path("categorie/", views.categoryList, name="list_category"),
path("<slug:slug_category>/", views.singleCategory_postList, name="single_category"),

path("", views.postList, name='list_post'),
path("<slug:slug_category>/<slug:slug_post>/", views.singlePost, name='single_blog_post'),

Когда я использую эти RedirectView, мне показана эта ошибка:

NoReverseMatch в / blog/ gis /

Реверс для 'single_blog_post' с аргументами ключевого слова '{' slug_post ':' gis '}' не найден.Попробован 1 шаблон (ов): ['blog \ / (? P [-a-zA-Z0-9 _] +) \ / (? P [-a-zA-Z0-9 _] +) \ / $']

Если я комментирую два пути RedirectView, ошибка исчезает, и я могу без проблем использовать сайт, но когда я использую старые пути, я вижу ошибку 404.

Я не понялкак работает RedirectView.Кто-нибудь может дать мне пример?

1 Ответ

1 голос
/ 27 марта 2019

Проблема в том, что ваш старый просмотр требует только пост-слаг, но ваш новый дополнительно требует слаг категории.Однако простой RedirectView не может сделать это перенаправление, потому что он может смотреть только на аргументы, переданные в исходном URL-адресе.Он не знает, как перейти к базе данных, чтобы найти слаг категории и использовать его в перенаправлении.

Итак, вам нужно написать представление перенаправления самостоятельно.Это может быть довольно просто:

def redirect_with_category(request, slug):
    post = get_object_or_404(Post, slug=slug)
    return redirect(post, permanent=True)

Обратите внимание, что redirect автоматически вызовет метод get_absolute_url сообщения.Также обратите внимание, что вы хотите использовать permanent=True для возврата 301, а не 302.

...