混合详细视图和表单 Mixin django 的问题

Kev*_*n H 3 python django detailsview mixins

我正在尝试使用 Django 为我的应用程序的博客部分创建一个评论系统。我试图将我的详细视图与表单 mixin 混合在一起,但我有点挣扎。提交表单后,不会保存,也不会出现错误。如果你们中的任何人可以提供帮助,我将不胜感激。

这是我的观点

class DetailPostView(FormMixin, DetailView):
    model = Post
    template_name = "blog/post_detail.html"
    context_object_name = "posts"
    form_class = CommentForm

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

    def post(self, request, *args, **kwargs):
        self.object = self.get_object()
        form = self.get_form()
        if form.is_valid():
            return self.form_valid(form)
        else:
            return self.form_invalid(form)

    def get_success_url(self):
        return reverse("post-detail", kwargs={"pk": self.object.pk})
Run Code Online (Sandbox Code Playgroud)

该模型

class Comment(models.Model):
    comment = models.ForeignKey(Post, on_delete=models.CASCADE)
    title = models.CharField(max_length=200)
    content = models.TextField()
    author = models.CharField(max_length=50)
    created_on = models.DateTimeField(auto_now_add=True)

    class Meta:
        ordering = ["-created_on"]

    def __str__(self):
        return self.title
Run Code Online (Sandbox Code Playgroud)

Wil*_*sem 5

发生这种情况的原因是因为您构造了一个传递给上下文数据的新表单,因此,它不会呈现任何错误,因为您构造了一个表单而不验证请求数据并呈现该表单,因此您不会显示首先拒绝数据的表单。

\n

但您不需要这样做。Django 的FormMixin[Django-doc]已经解决了这个问题。因此,您不应该重写该.get_context_data(\xe2\x80\xa6)方法 [Django-doc]

\n

另一个问题是您没有保存表单,您可以重写该form_valid方法,或者可以从ModelFormMixin[Django-doc]继承。

\n

最后,你最好先创建表单,然后分配self.object,否则它会将 this 作为实例传递给表单:

\n
from django.views.generic.edit import ModelFormMixin\n\nclass DetailPostView(ModelFormMixin, DetailView):\n    model = Post\n    template_name = \'blog/post_detail.html\'\n    context_object_name = \'posts\'\n    form_class = CommentForm\n\n    # no get_context_data override\n\n    def post(self, request, *args, **kwargs):\n        # first construct the form to avoid using it as instance\n        form = self.get_form()\n        self.object = self.get_object()\n        if form.is_valid():\n            return self.form_valid(form)\n        else:\n            return self.form_invalid(form)\n\n    def get_success_url(self):\n        return reverse(\'post-detail\', kwargs={\'pk\': self.object.pk})
Run Code Online (Sandbox Code Playgroud)\n