You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django报错:'ProductFeedbackView'对象无'get_form'属性

问题解决:'ProductFeedbackView' object has no attribute 'get_form'

核心原因

DetailView本身不包含表单处理相关方法(比如get_form、form_valid),这些方法来自FormMixin。你的视图仅继承了DetailView,因此调用self.get_form()时会触发属性不存在的报错。

分步修复

1. 调整视图继承结构

修改视图类,同时继承FormMixin和DetailView,注意FormMixin要放在继承顺序的前面(遵循Django类视图的方法解析规则):

from django.views.generic import DetailView
from django.views.generic.edit import FormMixin

class ProductFeedbackView(FormMixin, DetailView):
    model = Product
    template_name = 'services/product-feedback.html'
    form_class = CommentForm

    def get_success_url(self):
        return reverse('product-feedback', kwargs={'pk': self.object.pk})

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        # 修正初始化参数:将当前产品关联到评论的service字段
        context['form'] = self.get_form(self.form_class)
        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 form_valid(self, form):
        # 给评论关联当前用户和当前产品
        form.instance.author = self.request.user
        form.instance.service = self.object
        form.save()
        return super().form_valid(form)

2. 修正表单初始化逻辑

原代码中CommentForm(initial={'content': self.object})逻辑错误:content是字符串字段,不能赋值为Product对象。正确的做法是为评论的service字段赋值,让评论与当前产品建立关联。

3. 修复模板中的评论循环

模板里的循环{% for comment in comment.service.all %}存在两处问题:

  • 变量名重复(comment既是循环变量,又被用来访问关联对象)
  • 反向关联调用错误:Product模型的related_name是comments,应通过product.comments.all获取该产品的所有评论

修改后的模板循环部分:

{% for comment in product.comments.all %}
     <p>{{ comment.author }}</p>
     <p>{{ comment.content }}</p>
{% endfor %}

4. 可选优化

  • 评论模型的get_absolute_url应跳转到对应产品的反馈页,而非评论自身的主键页面:
def get_absolute_url(self):
    return reverse('product-feedback', kwargs={'pk': self.service.pk})
  • 表单content字段可添加textarea组件优化输入体验:
content = forms.CharField(widget=forms.Textarea(attrs={'rows':3}))

验证步骤

  1. 重启Django开发服务器
  2. 登录用户后访问产品反馈页,提交评论测试
  3. 确认评论成功保存并在页面显示,无报错信息

内容的提问来源于stack exchange,提问作者nameless

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 12:25:18