Bootstrap Modal内提交Django Form无法获取建筑主键实现更新的问题
问题核心原因
- 表单未指定
action属性,提交时默认使用当前加载列表页的URL(即/app/buildings/),导致请求被Buildings视图接收,而非NewBuilding视图 Buildings视图中直接调用NewBuilding.post()方法时,传入的self是Buildings类的实例,该实例不存在pk相关的kwargs参数,因此无法获取到建筑IDNewBuilding视图的post方法中,ID获取逻辑和新增/编辑分支判断存在错误
修复步骤
修改
new_building.html的表单标签,指定提交地址给form标签添加
action属性,绑定到当前编辑/新增对应的NewBuilding视图URL:<form class="form-horizontal" method="POST" action="{% url 'main_app:buildings-pk' pk=edited_building_id %}">删除
Buildings视图中的post方法现在表单会直接提交到
NewBuilding视图,不需要中转逻辑,删除该方法即可避免路由冲突。修复
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)补充URL路径后缀(可选,推荐)
给
buildings-pk对应的路由路径末尾加斜杠,避免Django的路由匹配异常:path('app/buildings/<int:pk>/', login_required(views.NewBuilding.as_view()), name='buildings-pk'),
内容的提问来源于stack exchange,提问作者mge90
相关产品推荐
相关产品推荐

