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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 02:33:22