Django UpdateView始终更新数据库首个元素问题求助
问题原因分析
你遇到的问题核心在于Django的UpdateView默认使用URL中的pk参数来定位要编辑的模型对象,但你的URL配置里:
path('release/<int:pk>/feature/<int:pk1>/update/', views.FeatureUpdate.as_view(), name='feature-update'),
pk对应的是Release的主键Feature的主键对应的是pk1
所以当你访问release/1/feature/2/update/时,UpdateView会错误地用pk=1去查询Feature模型,刚好数据库里id=1的Feature是feature-A,自然每次编辑的都是它,不管你传的pk1是多少。
解决方案
有两种简单的修复方式,选一种就行:
方案1:修改URL参数名(推荐)
把URL中Feature的主键参数改成pk,同时把Release的参数改成别的名字(比如release_pk),这样UpdateView就能自动识别正确的Feature主键:
path('release/<int:release_pk>/feature/<int:pk>/update/', views.FeatureUpdate.as_view(), name='feature-update'),
如果之后需要在视图里获取对应的Release对象,可以通过self.kwargs.get('release_pk')来获取。
方案2:在视图中指定主键参数名
如果你不想改URL,可以在FeatureUpdate视图里告诉Django要用pk1作为Feature的主键参数,设置pk_url_kwarg属性:
class FeatureUpdate(UpdateView): model = Feature fields = ['name'] pk_url_kwarg = 'pk1' # 指定用URL里的pk1作为Feature的主键
小提示
可以在视图里加个调试打印,确认拿到的参数是否正确:
class FeatureUpdate(UpdateView): model = Feature fields = ['name'] pk_url_kwarg = 'pk1' def get(self, request, *args, **kwargs): print("拿到的URL参数:", self.kwargs) # 打印参数,方便调试 return super().get(request, *args, **kwargs)
内容的提问来源于stack exchange,提问作者h_vm
相关产品推荐
相关产品推荐

