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

Django表单提交报__init__接收意外参数city_id错误,按城市存激励数据异常求助

Django表单按城市存储数据报错解决方案

核心报错是因为给IncentiveForm实例化时传入了city_id参数,但表单的__init__方法没有提前处理该参数,导致参数被传递给父类ModelForm的初始化方法时无法识别触发类型错误。同时还有路由参数格式、查询集操作的问题,共同导致无法正常按城市关联存储数据,修改方案如下:


1. 修正 forms.py

你不需要在表单里额外定义city_id字段(城市从路由参数获取,不需要用户提交),如果不需要在表单内使用city_id参数,实例化表单时就不要传该参数,或者在初始化方法里提前弹出不需要的参数:

class IncentiveForm(forms.ModelForm):
    class Meta:
        model = Incentive
        fields = ['start_date','end_date','no_of_trips','incentive']
        
    def __init__(self,*args,**kwargs):              
        self.request = kwargs.pop('request', None)
        # 如果要保留传city_id的写法,就加下面这行,否则实例化时不要传该参数
        # self.city_id = kwargs.pop('city_id', None)
        super().__init__(*args,**kwargs)

2. 修正 urls.py

路由的整数参数需要用尖括号包裹,否则无法正确捕获:

path('incentive/<int:city_id>/add', views.incentive_form, name="incentive_form")

3. 修正 views.py

原来的filter返回的是查询集,不是单个实例,无法直接修改属性保存,改用get_or_create实现存在就更新、不存在就新建的逻辑:

def incentive_form(request, city_id=None):
    city = City.objects.get(pk=city_id)
    # 拿到对应城市的Incentive实例,不存在就新建
    incentive_obj, created = Incentive.objects.get_or_create(city_id=city_id)
    if request.method == 'POST':
        # 直接将实例绑定到表单,不需要手动逐个字段赋值
        form = IncentiveForm(request.POST, instance=incentive_obj)
        if form.is_valid():
            form.save()
            messages.success(request,'Incentive data created successfully!')
    else:
        # 编辑场景下传入已有实例,表单会自动填充历史数据
        form = IncentiveForm(instance=incentive_obj)
        
    context = {
        'menu_incentive': 'active',
        'submenu_incentive_list': 'active',
        'city_id': city_id,
        'city': city,
        'form': form,
    }
    return render(request, "hiringprocess/incentive.html", context=context)

修改后即可正常按城市关联存储数据,同一个城市只会保留一条激励数据,多次提交会更新已有数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 11:15:05