使用get_absolute_url()方法提交表单后,将用户重定向到另一个页面



我是django的新手,正在学习创建博客的教程。我目前正在开发一个将帖子添加到博客的页面,我希望用户在提交表单后自动引导到帖子页面。我尝试使用get_absolute_url方法,但得到了这个错误:

在/my_blog/add_post上没有反向匹配/找不到'post-detail'的反向。'post-detail"不是有效的视图函数或模式名称。

我检查了我的代码,看看我是否做错了什么,但我没有注意到。我感谢你的帮助。

型号.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']

这是我在template目录中的add-post文件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,))

主键也是在(singleton(元组中传递的,因此是(self.pk,),而不是(self.pk)

相关内容

最新更新