Django SingleObjectMixin:找不到页面(404)

Django SingleObjectMixin: Page not found(404)

我目前正在为一个项目写博客,我想为 DetailView 中的每个 post 添加一个评论部分。我的代码看起来不错,但是我一直收到 "Page not Found(404) error"。我在想这可能是我的 url 模式,但我似乎无法弄清楚我做错了什么。

给出错误

url.py

urlpatterns[
     path('blog/post/<int:pk>/', views.PostDetailView.as_view(),name='post_detail'),
     path('blog/post/<int:pk>/comment/', views.MyFormView.as_view(), name='my_form_view_url'),
]

forms.py

class CommentForm(forms.ModelForm):
   class Meta():
       model = Comment
       fields = ('text',)
       widgets = {
           'text': forms.Textarea(attrs={'class':'ediable medium-editor-textarea'})
       }

views.py

class PostDetailView(DetailView):
    model = Post
    template_name = 'carsforsale/post_detail.html'

    def get_context_data(self, **kwargs):
        context = super(PostDetailView, self).get_context_data(**kwargs)
        context['form'] = CommentForm()
        return context

class MyFormView(SingleObjectMixin,FormView):
    template_name = 'carsforsale/post_detail.html'
    form_class = CommentForm
    model = Comment

    def post(self, request, *args, **kwargs):
        self.object = self.get_object()
        return super().post(request, *args, **kwargs)

    def get_success_url(self):
        return reverse('carsforsale:post_detail', kwargs={'pk': self.object.pk})

post_detail.html

这是post_detail.html

里面的表格
 <form method="POST" action="{% url 'carsforsale:my_form_view_url' pk=post.pk %}">
     {% csrf_token %}
     <div class="form-group">
         {% render_field form.text class="form-control text" rows=3 %}
     </div>
     <input type="submit" class="btn btn-primary" value="Comment" />
</form>

这些是我的 Post 和评论模型

class Post(models.Model):
    author = models.ForeignKey('auth.User', on_delete= models.CASCADE)
    title = models.CharField(max_length=200)
    text = models.TextField()
    created_date = models.DateTimeField(default=timezone.now)
    published_date = models.DateTimeField(blank=True, null=True)

    def publish(self):
        self.published_date = timezone.now()
        self.save()

    def approve_comments(self):
        return self.comments.filter(approved_comment=True)

    def get_absolute_url(self):
        return reverse("post_list")

    def __str__(self):
        return self.title

class Comment(models.Model):
    post = models.ForeignKey('carsforsale.Post', related_name='comments', on_delete = models.CASCADE)
    author = models.CharField(max_length=200)
    text = models.TextField()
    created_date = models.DateTimeField(default=timezone.now)
    approved_comment = models.BooleanField(default=False)

    def approve(self):
        self.approved_comment = True
        self.save()

    def get_absolute_url(self):
        return reverse("carsforsale:post_detail",kwargs={'pk':self.pk})

    def __str__(self):
        return self.text

据推测,MyFormView 的 URL 中的 pk 指的是 post 评论将附加到。但是视图本身有一个 Comment 模型属性,所以这就是 Django 尝试加载的模型。带有该 pk 的评论不存在,因此出现错误。

您将需要覆盖 get_object 以直接执行查询和 return 对象。您还需要覆盖 form_valid 以将新评论与 post.

相关联
def get_object(self, **kwargs):
    return get_object_or_404(Post, pk=self.kwargs["pk"]

def form_valid(self, form):
    form.instance.post = self get_object()
    return super().form_valid(form)