如何在Django Admin页面为关联模型自动填充主模型ID?
问题描述
我在Django Admin中为主模型Master添加了「下一步」按钮,点击后跳转至关联的子模型页面。需求是:点击「下一步」时自动将当前Master的ID填充到子模型对应的外键字段中。目前已通过Cookie实现了ID的存储与读取API,但不清楚如何修改forms.py完成自动填充,现有代码如下:
现有代码
views.py
def setcookie(request): response = HttpResponseRedirect('/admin/core/masterfertilizer/add/') response.set_cookie('crop', request.GET.get("crop_id")) return response def getcookie(request): crop_id = request.COOKIES['crop'] return JsonResponse({'data': [crop_id]})
admin.py
def response_change(self, request, obj): if "_next" in request.POST: return redirect(f'/core/setcookie/crop_id?crop_id={obj}') return super().response_change(request, obj)
crop.js
function getCropID(){ let $ = django.jQuery; $.get('/core/getcookie/', function(resp){ console.log(resp); document.querySelector('#id_master_crop_id').value=parseInt(x.split(';')[1].split('=')[1]); }); }
forms.py
self.fields['master_crop_id'].widget = forms.Select( attrs={ 'id': 'id_master_crop_id', 'onchange': 'getCropID()', 'style': 'width:200px' }, )
修正方案
1. 修复JS逻辑错误
原JS代码存在未定义变量x,且无需手动解析Cookie字符串(接口已返回处理后的ID),修改crop.js:
django.jQuery(document).ready(function(){ $.get('/core/getcookie/', function(resp){ // 直接取接口返回的ID填充字段 $('#id_master_crop_id').val(parseInt(resp.data[0])); }); });
2. 调整forms.py触发时机
将原onchange触发改为页面加载时自动执行,移除无效的onchange属性:
self.fields['master_crop_id'].widget = forms.Select( attrs={ 'id': 'id_master_crop_id', 'style': 'width:200px' }, )
3. 完善Cookie读写可靠性
- 给Cookie设置过期时间,避免长期残留;同时判断ID是否存在,防止空值写入:
def setcookie(request): crop_id = request.GET.get("crop_id") response = HttpResponseRedirect('/admin/core/masterfertilizer/add/') if crop_id: response.set_cookie('crop', crop_id, max_age=3600) # 1小时过期 return response
- 处理Cookie不存在的情况,避免报错:
def getcookie(request): crop_id = request.COOKIES.get('crop') return JsonResponse({'data': [crop_id] if crop_id else []})
4. 修正Admin跳转URL格式
直接输出模型实例会得到对象字符串,需明确取id;同时修正URL路径错误:
def response_change(self, request, obj): if "_next" in request.POST: return redirect(f'/core/setcookie/?crop_id={obj.id}') return super().response_change(request, obj)
内容的提问来源于stack exchange,提问作者Abhinav Kumar Sinha
相关产品推荐
相关产品推荐

