尝试在Django中添加任何评论时,添加评论表单显示错误

时间:2020-06-07 14:37:50

标签: django django-models django-forms django-views django-templates

更新:我已经更改了views.py中的一些代码。

基本的源文件are here,我正在尝试添加注释和回复系统

views.py代码如下:

from .models import Post,Comment
from .forms import CommentForm
from django.shortcuts import redirect,render, get_object_or_404
from django.views.generic import ListView,DetailView
from django.views.generic.edit import FormMixin
from django.http import HttpResponseRedirect
from django.urls import reverse_lazy
from django.views.generic.base import RedirectView


class PostList(ListView):
    model=Post
    template_name='home.html'
    context_object_name='post_list'
    queryset=Post.objects.all()

class PostDetail(DetailView):
    model=Post
    template_name='post_detail.html'

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

    def get_context_data(self, **kwargs):
        context = super(PostDetail, self).get_context_data(**kwargs)
        context['comments']=Comment.objects.filter(post=self.object)
        context['comment_form']=CommentForm()
        return context


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

    def form_valid(self, comment_form):
        comment_form.instance.post = self.object
        comment_form.save()
        return super().form_valid(comment_form)

当我执行运行服务器时,它显示 ** AttributeError位于/ post / 1 / “ PostDetail”对象没有属性“ get_form” **

models.py是:

from django.db import models
from django.contrib.auth.models import User

class Post(models.Model):
    title = models.CharField(max_length=200, unique=True)
    author = models.ForeignKey(User, on_delete= models.CASCADE,related_name='blog_posts')
    content = models.TextField()

    def __str__(self):
        return self.title

class Comment(models.Model):
    post = models.ForeignKey(Post,on_delete=models.CASCADE,related_name='comments')
    name = models.CharField(max_length=80)
    body = models.TextField()
    reply=models.ForeignKey('Comment',on_delete=models.CASCADE,null=True)


    def __str__(self):
        return self.name

帖子详细信息页面显示评论和“评论”表单以添加评论。但是,当我尝试通过表单添加任何评论时,显示错误。我用完了主意。 如果您有任何想法,请告诉我。提前谢谢

2 个答案:

答案 0 :(得分:0)

在基于类的视图中,您无需自己调用render函数

您在-get_context_data中放置了大量代码的方法-不应该返回render函数的输出。 它应该只是返回模板的上下文字典

您也无需在get_context_data中指定模板,它应该是template_name='Post_detail.html'之下或之上的类model=Post的属性

此外,当您接受表单提交时,使用FormView可能会更好。 https://docs.djangoproject.com/en/3.0/ref/class-based-views/generic-editing/#django.views.generic.edit.FormView

除此之外-在基于类的视图中获取请求的方法是使用self.request。 但是,如果使用FormView,它将处理您当前正在使用的所有请求。

答案 1 :(得分:0)

我已经在基于类的视图中解决了它。

views.py:

from django.views.generic.edit import FormMixin

    class PostDetail(DetailView,FormMixin):
        model=Post
        template_name='post_detail.html'
        login_url='login'
        form_class=CommentForm
        def get_success_url(self):
            return reverse_lazy('post_detail', kwargs={'pk': self.object.pk})
        def get_context_data(self, **kwargs):
            context = super(BlogappDetailView, self).get_context_data(**kwargs)
            context['comments']=Comment.objects.filter(post=self.object)
            context['comment_form']=CommentForm()
            return context
        def post(self, request, *args, **kwargs):
            self.object = self.get_object()
            comment_form = self.get_form()
            if comment_form.is_valid():
                return self.form_valid(comment_form)
            else:
                return self.form_invalid(comment_form)

        def form_valid(self, comment_form):
            comment_form.instance.post = self.object
            comment_form.instance.author=self.request.user
            comment_form.save()
            return super().form_valid(comment_form)

其余部分根据模板和形式相同。

再次感谢,如果有人需要,请保留答案以备将来使用