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
相关产品推荐
相关产品推荐

