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}))
验证步骤
- 重启Django开发服务器
- 登录用户后访问产品反馈页,提交评论测试
- 确认评论成功保存并在页面显示,无报错信息
内容的提问来源于stack exchange,提问作者nameless
相关产品推荐
相关产品推荐

