创建新帖子后如何将用户重定向到新创建的帖子

时间:2020-08-04 14:17:50

标签: python django django-models django-views

我希望将用户重定向到我尝试添加的新创建帖子

return reverse("article-detail", args=(str(self.pk))),但是不起作用。 在命令提示符下显示“

django.urls.exceptions.NoReverseMatch:反转为“文章详细信息” 找不到带有参数'('4','3')'的参数。尝试了1种模式: ['article /(?P [0-9] +)$']

`

models.py

Class Post(models.Model):
    title = models.CharField(max_length=255)
    header_image = models.ImageField(null=True, blank=True, upload_to='images/')
    title_tag = models.CharField(max_length=255)
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    body = RichTextField(blank=True, null=True)
    # body = models.TextField()
    post_date = models.DateTimeField(auto_now_add=True)
    category = models.CharField(max_length=255, default='coding')
    snippet = models.CharField(max_length=255)
    likes = models.ManyToManyField(User, related_name='blog_post')

    def total_likes(self):
        return self.likes.count

    def __str__(self):
        return self.title + ' | ' + str(self.author)

    def get_absolute_url(self):
        return reverse("article-detail", args=(str(self.pk)))
        # return reverse("home")

urls.py

path('add_post/', AddPostView.as_view(), name="add_post"),
path('article/<int:pk>', ArticleDetailView.as_view(), name="article-detail"),

views.py

class AddPostView(CreateView):
    model = Post
    form_class = PostForm
    template_name = 'add_post.html'

3 个答案:

答案 0 :(得分:1)

您的get_absolute_url方法不正确,相反,您可以使用kwargs将参数提供为 dict 或将args提供为 list 。对于您的情况,您应该使用我在上面的评论中提到的列表来完成此操作。

def get_absolute_url(self):
    return reverse("article-detail", args=[self.pk])

答案 1 :(得分:0)

在您的addpostview类中,您可以指定成功网址。

 `class AddPostView(CreateView):
    model=Post
    form_class=PostForm
    template_name='add_post.html'
    success_url='article/article_id/'`
    

答案 2 :(得分:0)

为什么不这样重写获取绝对URL。我猜是因为您将网址路径ID指定为int,并且将其转换为str以获得绝对网址

def get_absolute_url(self):
    return reverse("article-detail", kwargs={pk:self.pk})