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

Bootstrap Modal内提交Django Form无法获取建筑主键实现更新的问题

问题核心原因

  1. 表单未指定action属性,提交时默认使用当前加载列表页的URL(即/app/buildings/),导致请求被Buildings视图接收,而非NewBuilding视图
  2. Buildings视图中直接调用NewBuilding.post()方法时,传入的self是Buildings类的实例,该实例不存在pk相关的kwargs参数,因此无法获取到建筑ID
  3. NewBuilding视图的post方法中,ID获取逻辑和新增/编辑分支判断存在错误

修复步骤

  1. 修改new_building.html的表单标签,指定提交地址

    给form标签添加action属性,绑定到当前编辑/新增对应的NewBuilding视图URL:

    <form class="form-horizontal" method="POST" action="{% url 'main_app:buildings-pk' pk=edited_building_id %}">
    
  2. 删除Buildings视图中的post方法

    现在表单会直接提交到NewBuilding视图,不需要中转逻辑,删除该方法即可避免路由冲突。

  3. 修复NewBuilding视图的post方法逻辑

    替换原有post方法的代码,正确处理新增和编辑分支,同时复用ModelForm的能力简化逻辑:

    class NewBuilding(FormView):
        template_name = 'main_app/new/new_building.html'
        form_class = forms.NewBuildingForm
        success_url = reverse_lazy('main_app:buildings') # 操作成功跳转地址
    
        # ... 保留原有get_context_data、get_form_kwargs方法不变
    
        def post(self, request, *args, **kwargs):
            form = self.get_form()
            if form.is_valid():
                building_pk = self.kwargs.get('pk', 0)
                if building_pk > 0:
                    # 编辑模式,更新现有实例
                    building = models.Building.objects.get(id=building_pk)
                    form = self.form_class(request.POST, instance=building)
                building = form.save(commit=False)
                building.site = models.Site.objects.get(id=self.request.session.get('active_site'))
                building.save()
                return self.form_valid(form)
            else:
                return self.form_invalid(form)
    
  4. 补充URL路径后缀(可选,推荐)

    给buildings-pk对应的路由路径末尾加斜杠,避免Django的路由匹配异常:

    path('app/buildings/<int:pk>/', login_required(views.NewBuilding.as_view()), name='buildings-pk'),
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.11 15:12:02