【问题标题】:Add comment form is showing error when try to add any comment in django尝试在 django 中添加任何评论时,添加评论表单显示错误
【发布时间】:2020-06-07 14:37:50
【问题描述】:

更新:我更改了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)

当我执行它显示的 runserver **/post/1/ 处的 AttributeError “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

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

【问题讨论】:

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


    【解决方案1】:

    在基于类的视图中,您不需要自己调用渲染函数

    您将大量代码放入的方法 - get_context_data - 不应返回渲染函数的输出。 它应该只返回模板的上下文字典

    另外你没有在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,它将处理您当前正在使用的所有地方的请求。

    【讨论】:

    • 我更新了 PostDetail 视图。如果没问题,请检查一下?
    【解决方案2】:

    我已经在基于类的视图中解决了这个问题。

    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)
    

    根据模板和表格,其余部分相同。

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

    【讨论】:

      猜你喜欢
      • 2019-02-08
      • 2013-08-01
      • 1970-01-01
      • 2022-11-20
      • 1970-01-01
      • 2022-11-18
      • 2014-07-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多