【问题标题】:Reverse from POST method in django class based view (DetailView)在基于 django 类的视图(DetailView)中从 POST 方法反转
【发布时间】:2019-12-28 12:47:06
【问题描述】:

我可能有一些微不足道的问题,但我是 Django 的新手,我不知道为什么我想在这里重定向时出错。我得到正确的 url 但我得到错误 'str' object has no attribute 'get'。我错了什么?表格是正确的,对象是在数据库中创建的。这只是关于错误的重定向。感谢您的帮助。

我的 urls.py:

urlpatterns = [
    path('', PostListView.as_view(), name='blog-home'),
    path('user/<str:username>/', UserPostListView.as_view(), name='user-posts'),
    path('post/<int:pk>/', PostDetailView.as_view(), 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('comments/delete/<int:pk>/', views.CommentDeleteView.as_view(), name='delete-comment'),
    path('about/', views.about, name='blog-about'),

]

views.py

class PostDetailView(DetailView):
    model = Post

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['comments'] = Comment.objects.all()[::-1]
        context['comm_form'] = CommentCreateForm()
        return context

    def post(self, request, *args, **kwargs):
        if request.method == 'POST':  
            comm_form = CommentCreateForm(request.POST)
            comm_form.instance.post = Post.objects.get(id=self.kwargs.get('pk'))
            comm_form.instance.author = self.request.user 
            comm_form.save()
            return reverse('post-detail', kwargs={'pk': self.kwargs.get('pk')})
        else:
            comm_form = CommentCreateForm()
            return reverse('post-detail', kwargs={'pk': self.kwargs.get('pk')})

models.py

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)

    def __str__(self):
        return self.title

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


class Comment(models.Model):
    comm_content = models.TextField(max_length=200)
    add_date = models.DateTimeField(default=timezone.now)
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    post = models.ForeignKey(Post, on_delete=models.CASCADE)

    def __str__(self):
        return f"Comment of post {self.post} posted at {self.add_date}."

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

Error view

【问题讨论】:

  • 您的视图返回一个字符串,而不是HttpResponse。但您需要显示您的PostDetailView 的详细信息,以便我们为您提供帮助。
  • 当然,对不起,我忘了添加最重要的:)已经编辑了。

标签: django redirect


【解决方案1】:

reverse(..) function [Django-doc] 返回一个字符串,其中包含您重定向到的路径。但是视图需要返回一个HttpResponse,例如一个HttpResponseRedirect [Django-doc]

您可以使用redirect(..) function [Django-doc] 来组合计算反向,并将结果包装在HttpResponse 中。因此,您可以将代码修改为:

from django.shortcuts import redirect

class PostDetailView(DetailView):
    model = Post

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['comments'] = Comment.objects.all()[::-1]
        context['comm_form'] = CommentCreateForm()
        return context

    def post(self, request, *args, **kwargs):
        if request.method == 'POST':  
            comm_form = CommentCreateForm(request.POST)
            comm_form.instance.post = Post.objects.get(id=self.kwargs.get('pk'))
            comm_form.instance.author = self.request.user 
            comm_form.save()
            return redirect('post-detail', pk=self.kwargs.get('pk'))
        else:
            return redirect('post-detail', pk=self.kwargs.get('pk'))

【讨论】:

    猜你喜欢
    • 2013-03-25
    • 2016-08-19
    • 2016-05-20
    • 1970-01-01
    • 2018-03-05
    • 1970-01-01
    • 2012-12-31
    • 1970-01-01
    • 2012-01-25
    相关资源
    最近更新 更多