Перенаправление пользователя на другую страницу после отправки формы с помощью метода get_absolute_url()

Я новичок в django и следую учебнику, пытаясь создать блог. Сейчас я работаю над страницей для добавления постов в блог и хочу, чтобы после отправки формы пользователь автоматически направлялся на страницу поста. Я пытался использовать метод get_absolute_url, но получил такую ошибку:

NoReverseMatch at /my_blog/add_post/ Обратное соответствие для 'post-detail' не найдено. 'post-detail' не является допустимой функцией представления или именем шаблона.

Я проверил свой код, чтобы увидеть, не сделал ли я что-нибудь неправильно, но не смог заметить. Заранее благодарен за любую помощь.

models.py

from django.db import models
from django.contrib.auth.models import User
from django.urls import reverse


class Post(models.Model):
    STATUS = [
        (0, 'Drafted'),
        (1, 'Published'),
    ]
    title = models.CharField(max_length=200, unique=True)
    slug = models.SlugField(max_length=200, unique=True)
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    created_on = models.DateTimeField(auto_now_add=True)
    published_on = models.DateTimeField(auto_now=True)
    content = models.TextField()
    status = models.IntegerField(choices=STATUS, default=0)

    class Meta:
        ordering = ['-created_on']

    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse('post-detail', args=(str(self.id)))

urls.py


from django.urls import path
from .views import PostListView, PostDetailView, AddPostView, UpdatePostView
app_name = 'my_blog'
urlpatterns = [
    path('', PostListView.as_view(), name='posts'),
    path('post/<int:pk>', PostDetailView.as_view(), name='post-detail'),
    path('add_post/', AddPostView.as_view(), name='add-post'),
    path('post/edit/<int:pk>', UpdatePostView.as_view(), name='update-post'),

]

views.py

from django.shortcuts import render
from django.views.generic import ListView, DetailView, CreateView, UpdateView
from .models import Post


class PostListView(ListView):
    model = Post
    template_name = 'post_list.html'
    context_object_name = 'latest_post_list'


class PostDetailView(DetailView):
    model = Post
    template_name = 'my_blog/post_detail.html'


class AddPostView(CreateView):
    model = Post
    template_name = 'my_blog/add_post.html'
    fields = ('__all__')


class UpdatePostView(UpdateView):
    model = Post
    template_name = 'my_blog/update_post.html'
    fields = ['title', 'content']

Вот мой файл добавления поста в каталоге шаблонов add_post.html

{% extends 'base.html' %} {% block content %}
<h1>Add post...</h1>
<form method="post">
  {% csrf_token %} {{ form.as_p }}
  <input type="submit" value="Submit" />
</form>
{% endblock %}

Вы использовали app_name, поэтому вам следует указать это пространство имен с помощью:

class Post(models.Model):
    # …

    def get_absolute_url(self):
        return reverse('my_blog:post-detail', args=(self.pk,))

Первичный ключ также передается в виде кортежа (синглтон), поэтому (self.pk,), а не (self.pk).

Вернуться на верх