Django中使用uuid4生成无短横线合法UUID格式的问题求助
Django UUID格式报错问题解决方案
问题根因
- Django的
UUIDField默认仅支持带短横线的标准8-4-4-4-12格式UUID,无法自动识别无短横线的32位十六进制字符串格式 - 报错信息中的空UUID提示,说明存在UUID字段被传入空值的情况,核心是缺少表单校验环节,以及传参逻辑异常
可行解决方案
1. 修复新增场景报错
首先检查collectionform的完整定义,确认没有手动添加registeri字段,你的模型中已经配置了editable=False和default=uuid.uuid4,该字段不需要表单传入值,会自动生成。
然后给新增逻辑添加表单校验,避免非法数据提交:
def collection(request): if request.method=='GET': return render (request,'register/collection.html',{'form':collectionform()}) else: form=collectionform(request.POST) # 新增表单校验,过滤非法数据 if form.is_valid(): newcollectionform=form.save(commit=False) newcollectionform.save() return render (request,'register/collection.html',{'form':collectionform()})
2. 修复更新/查询场景报错
编辑页面跳转时传入的主键为无短横线的32位字符串,需要先转为标准UUID格式再查询,修改视图代码:
import uuid from django.http import Http404 def editcollection(request,registertable_pk): # 兼容无短横线UUID格式,转成标准UUID对象再查询 try: parsed_uuid = uuid.UUID(registertable_pk) except ValueError: raise Http404("记录不存在") collection=get_object_or_404(registertable,pk=parsed_uuid) if request.method=='GET': form=collectionform(instance=collection) return render(request,'register/editcollection.html',{'collection':collection,'form':form}) else: try: form=collectionform(request.POST,instance=collection) # 新增表单校验 if form.is_valid(): form.save() return redirect('seecollection') else: return render(request,'register/editcollection.html',{'collection':collection,'form':form,'error':'表单数据有误'}) except ValueError: return render(request,'register/editcollection.html',{'collection':collection,'form':form,'error':'输入不合法'})
3. 从根源避免无短横线UUID传参
修改列表页seecollection.html中的编辑跳转链接,直接使用模型的UUID字段值,不要调用.hex属性,Django会自动渲染为带短横线的标准格式:
<!-- 错误写法,会生成无短横线的32位UUID --> <a href="{% url 'editcollection' collection.registeri.hex %}">编辑</a> <!-- 正确写法,生成标准带短横线的UUID --> <a href="{% url 'editcollection' collection.registeri %}">编辑</a>
内容的提问来源于stack exchange,提问作者Ritu
相关产品推荐
相关产品推荐

