Django ForeignKey表单POST返回ID而非字符串值的解决咨询
解决ForeignKey表单提交后获取实际名称而非ID的问题
我完全懂你的困扰——表单下拉框显示的是友好的名称,但提交后拿到的却是纯数字ID,用来做计算或者填充邮件内容确实闹心。这里有两个超简单的解决办法,优先推荐第一个,省心又靠谱:
方法1:直接从验证后的表单实例获取(最简便)
当表单通过form.is_valid()验证后,form.instance已经是一个绑定了有效数据的Quote实例,你可以直接通过它访问关联的Data对象的name字段,完全不用手动处理POST里的ID。
修改你的views.py代码如下:
def quote_req(request): submitted = False if request.method == 'POST': form = QuoteForm(request.POST, request.FILES) if form.is_valid(): # 直接从验证后的表单实例拿到真实名称 actual_name = form.instance.name.name data_dict = { 'name_': actual_name, } inputdictionary = data_dict # 别忘了添加表单保存的代码,比如 form.save() submitted = True
这个方法的优势在于:表单已经帮你完成了合法性校验,确保这个ID对应的Data对象一定存在,不需要额外处理异常,代码也最简洁。
方法2:通过POST的ID查询Data模型(备用场景)
如果因为某些特殊需求,必须从request.POST的ID入手,那可以通过ID查询对应的Data对象,再提取名称:
def quote_req(request): submitted = False if request.method == 'POST': form = QuoteForm(request.POST, request.FILES) name_id = request.POST['name'] if form.is_valid(): try: # 根据ID查询对应的Data对象 data_obj = Data.objects.get(id=name_id) actual_name = data_obj.name except Data.DoesNotExist: # 处理ID不存在的情况(不过表单验证后基本不会走到这里) actual_name = "未知名称" data_dict = { 'name_': actual_name, } inputdictionary = data_dict submitted = True
补充说明
之所以POST拿到的是ID,是因为Django的ForeignKey在生成表单下拉框时,<option>标签的value默认就是关联模型的主键ID,而显示的文本是你在Data模型__str__方法里返回的name——这是ForeignKey的标准行为,目的是保证数据传输的准确性(毕竟名称可能重复,但ID是唯一的)。
内容的提问来源于stack exchange,提问作者JcoOnline
相关产品推荐
相关产品推荐

