更新帖子后,我希望将用户重定向到帖子(Django - Python)

Posted

技术标签:

【中文标题】更新帖子后,我希望将用户重定向到帖子(Django - Python)【英文标题】:After updating the post, I want the user to be redirected to the post (Django - Python) 【发布时间】:2020-08-10 11:39:51 【问题描述】:

我希望用户能够更新现有帖子。当用户单击更新,然后单击发布时,他们会收到一条错误消息,指出没有可定向的 URL。但是帖子确实在后端更新。

我认为return reverse('article_detail', kwargs='slug': self.slug) 行会将他们重定向回原来的帖子。

class Post(models.Model):
    title = models.CharField(max_length=100)
    content =  models.TextField()
    date_posted = models.DateTimeField(default=timezone.now())
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    url= models.SlugField(max_length=500, blank=True)
    #url= models.SlugField(max_length=500, unique=True, blank=True)

    def save(self, *args, **kwargs):
        self.url= slugify(self.title)
        super().save(*args, **kwargs)

    def __str__(self):
        return self.title 

    def get_absolute_url(self):
        return reverse('article_detail', kwargs='slug': self.slug)

这是表架构。

sqlite> .schema blog_post
CREATE TABLE IF NOT EXISTS "blog_post" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "title" varchar(100) NOT NULL, "content" text NOT NULL, "url" varchar(500) NOT NULL, "author_id" integer NOT NULL REFERENCES "auth_user" ("id") DEFERRABLE INITIALLY DEFERRED, "date_posted" datetime NOT NULL);
CREATE INDEX "blog_post_url_5af1045a" ON "blog_post" ("url");
CREATE INDEX "blog_post_author_id_dd7a8485" ON "blog_post" ("author_id");
sqlite>

views.py

class PostUpdateView(LoginRequiredMixin, UserPassesTestMixin, UpdateView):
    model = Post
    fields = ['title', 'content']

    def form_valid(self, form):
        form.instance.author = self.request.user
        return super().form_valid(form)


    def test_func(self):
        post = self.get_object()
        if self.request.user == post.author:
            return True
        return False

urls.py

urlpatterns = [
    path('', PostListView.as_view(), name='blog-home'),
    path('post/<int:pk>/', views.post_detail, name='post-detail'),
    path('post/new/', PostCreateView.as_view(), name='post-create'),
    path('post/<int:pk>/update/', PostUpdateView.as_view(), name='post-update'),
    path('post/<int:pk>/delete/', PostDeleteView.as_view(), name='post-delete'),
    path('about/', views.about, name='blog-about'),
    path('facebook/',TemplateView.as_view(template_name='blog/index.html'), name="facebook")
]

更新

我以前有self.url= slugify(self.title),后来改成了self.url= slugify(self.id)。因为要访问我的帖子,您输入的是 ID 号而不是标题。不幸的是,问题仍然存在。

class Post(models.Model):
    title = models.CharField(max_length=100)
    content =  models.TextField()
    date_posted = models.DateTimeField(default=timezone.now())
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    url= models.SlugField(max_length=500, blank=True)
    #url= models.SlugField(max_length=500, unique=True, blank=True)

    def save(self, *args, **kwargs):
        self.url= slugify(self.id)
        super().save(*args, **kwargs)

更新 2

我现在收到此错误消息。

未找到“article_detail”的反向。 'article_detail' 不是有效的视图函数或模式名称。

【问题讨论】:

您可以添加您的观点吗? 我现在已将它们添加到我的原始帖子中。 你也可以添加你的 urls.py 吗? 我现在已将它们添加到我的原始帖子中。 您没有任何名为 slug 的模型字段,因此使用 self.slug 没有任何意义。 【参考方案1】:

修复get_absolute_url

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

【讨论】:

我现在只是在测试。 很遗憾,我仍然收到错误消息 Reverse for 'article_detail' not found。 “article_detail”不是有效的视图函数或模式名称。 转到你的 models.py。用上面的函数替换你的 get_absolute_url 函数。 非常感谢

以上是关于更新帖子后,我希望将用户重定向到帖子(Django - Python)的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Django 中使用基于类的视图将用户重定向到登录页面? [复制]

前端登录:重定向到用户创建的帖子

Rails在破坏行动后重定向

表单验证重定向问题

如何将我在Http中的所有帖子/页面重定向到Https

Flask:提交后如何重定向到帖子视图?