如何在Django DetailView中为每个Instance添加评论编辑表单?
解决方案
1. 修正表单定义
你当前的InstanceComment表单绑定的是Instance模型,但实际需要编辑的是Comment模型,先修改forms.py:
# forms.py from django.forms import ModelForm from .models import Comment class CommentForm(ModelForm): class Meta: model = Comment fields = ['content'] # 替换成Comment模型中实际需要编辑的字段,比如评论内容字段
2. 自定义Asset详情视图
继承DetailView,重写get_context_data和post方法,处理多表单的生成与提交逻辑:
# views.py from django.views.generic.detail import DetailView from .models import Asset, Comment, Instance from .forms import CommentForm class AssetDetailView(DetailView): model = Asset template_name = 'asset_detail.html' # 替换为你的实际模板路径 def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) # 获取当前Asset关联的所有Instance instances = self.object.instances.all() # 为每个Instance生成对应评论表单(无评论则创建空评论对象) instance_form_list = [] for instance in instances: comment, _ = Comment.objects.get_or_create(instance=instance) # 用Instance的ID作为表单前缀,区分不同Instance的表单 form = CommentForm(instance=comment, prefix=f'comment_{instance.id}') instance_form_list.append({ 'instance': instance, 'form': form }) context['instance_form_list'] = instance_form_list return context def post(self, request, *args, **kwargs): self.object = self.get_object() instances = self.object.instances.all() # 遍历处理每个Instance对应的表单提交 for instance in instances: prefix = f'comment_{instance.id}' comment, _ = Comment.objects.get_or_create(instance=instance) form = CommentForm(request.POST, instance=comment, prefix=prefix) if form.is_valid(): form.save() # 提交后重定向回当前详情页刷新内容 return self.get(request, *args, **kwargs)
3. 模板渲染多表单
在asset_detail.html中,遍历表单列表,为每个Instance渲染对应的评论编辑表单:
<!-- asset_detail.html --> <h1>{{ object.name }}</h1> <!-- 替换为Asset模型的实际字段,比如名称 --> {% for item in instance_form_list %} <div class="instance-comment-section"> <h3>实例: {{ item.instance.id }}</h3> <!-- 显示Instance的标识,可替换为实际字段 --> <form method="post"> {% csrf_token %} {{ item.form.as_p }} <button type="submit">保存评论</button> </form> </div> {% endfor %}
核心逻辑说明
- 用表单前缀
prefix=f'comment_{instance.id}'区分不同Instance的表单,确保Django能正确识别每个表单的提交数据。 get_or_create方法保证每个Instance都有对应的Comment对象,新Instance也能直接编辑评论。- POST请求处理时,遍历所有Instance对应的表单,验证并保存有效数据,最后重定向回详情页完成刷新。
内容的提问来源于stack exchange,提问作者Sylvain
相关产品推荐
相关产品推荐

