我是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)
。