首页 > 解决方案 > 如何使用 django 泛型类删除我的帖子?

问题描述

我想删除我的博客文章,但是当我点击确认删除时,它说

NoReverseMatch at /post/10/delete/
Reverse for 'post-by-author' with no arguments not found. 1 pattern(s) tried: ['post/detail/(?P<pk>[0-9]+)$']
Request Method:	POST
Request URL:	http://127.0.0.1:8500/post/10/delete/
Django Version:	3.0.2
Exception Type:	NoReverseMatch
Exception Value:	
Reverse for 'post-by-author' with no arguments not found. 1 pattern(s) tried: ['post/detail/(?P<pk>[0-9]+)$']
Exception Location:	/Users/antonia/PycharmProjects/MySite/venv/lib/python3.8/site-packages/django/urls/resolvers.py in _reverse_with_prefix, line 677
Python Executable:	/Users/antonia/PycharmProjects/MySite/venv/bin/python
Python Version:	3.8.1
Python Path:	
['/Users/antonia/PycharmProjects/MySite/mysite',
 '/Library/Frameworks/Python.framework/Versions/3.8/lib/python38.zip',
 '/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8',
 '/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/lib-dynload',
 '/Users/antonia/PycharmProjects/MySite/venv/lib/python3.8/site-packages',
 '/Users/antonia/PycharmProjects/MySite/venv/lib/python3.8/site-packages/setuptools-40.8.0-py3.8.egg',
 '/Users/antonia/PycharmProjects/MySite/venv/lib/python3.8/site-packages/pip-19.0.3-py3.8.egg']
Server time:	Tue, 14 Jan 2020 21:25:06 +0000

删除帖子后,我想返回用户的帖子页面吗?我还为 Html 表单 post_confirm_delete 正确命名了该文件。

我试图将我在 reverse_lazy 中放入的内容更改为 (posts/post/blogs/blog/blog:index/blog:post-detail/blog:post-by-author) 似乎没有任何效果?

class PostDelete(DeleteView):
    model = Post
    success_url = reverse_lazy('post-by-author')

这个表格

{% extends "../base.html" %}

{% block content %}
<div class="container">
    <h1>Delete Post</h1>

    <p>Are you sure you want to delete this post: {{ post }}?</p>

    <form action="" method="POST">
      {% csrf_token %}
      <input type="submit" action="" value="Yes, delete." />
    </form>
</div>
{% endblock %}

我的模型

class PostAuthor(models.Model):
    user = models.OneToOneField(User, on_delete=models.SET_NULL, null=True, related_name='authors')
    bio = models.TextField(max_length=400, help_text="Enter your bio details here.")

    class Meta:
        ordering = ["user", "bio"]

    def get_absolute_url(self):
        return reverse('post-by-author', args=[str(self.id)])

    def __str__(self):
        return self.user.username


class Post(models.Model):
    title = models.CharField(max_length=200, unique=False)
    slug = models.SlugField(max_length=200, null=True, blank=True)
    author = models.ForeignKey(PostAuthor, on_delete=models.CASCADE, null=False, blank=True)
    updated_on = models.DateTimeField(auto_now=True)
    content = models.TextField()
    created_on = models.DateTimeField(auto_now_add=True)
    status = models.IntegerField(choices=STATUS, default=0)

    class Meta:
        ordering = ['-created_on']

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

    def __str__(self):
        return self.title

网址文件

urlpatterns = [
    path('', views.IndexPage.as_view(), name='index'),
    path('posts/', views.PostList.as_view(), name='all-posts'),
    path('post/detail/<int:pk>', views.PostListbyAuthorView.as_view(), name='post-by-author'),
    path('post/author/<int:pk>', views.PostDetail.as_view(), name='post-detail'),
    path('post/create/', views.PostCreate.as_view(), name='post-create'),
    path('post/<int:pk>/edit/', views.PostUpdate.as_view(), name='post-edit'),
    path('post/<int:pk>/delete/', views.PostDelete.as_view(), name='post-delete'),
    path('post/<int:pk>/comment/', views.PostComment.as_view(), name='post-comment'),
    path('accounts/', include('django.contrib.auth.urls')),
]

标签: pythonhtmldjango

解决方案


Django is expecting kwargs, and not args, in your model:

class PostAuthor(models.Model):

    ...

    def get_absolute_url(self):
        return reverse('post-by-author', kwargs={'pk':self.pk})


class Post(models.Model):

    ...

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

Here are the docs for this topic.


推荐阅读