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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 17:45:32