Python 多值DictKeyError请求方法:GET(Django)

Python 多值DictKeyError请求方法:GET(Django),python,django,Python,Django,我最近开始学习和使用Django,我多次遇到这个错误,有时是因为在html中重复使用了一个名称,有时是因为“variable\u name=request.POST['variable\u name']”之类的部分 关于这个错误,我访问了多个网站,并找到了一个解决方案,即在views.py的函数中键入“variable\u name=request.POST['variable\u name']”后 下一次我尝试再次发布数据“variable\u name=request.POST['varia

我最近开始学习和使用Django,我多次遇到这个错误,有时是因为在html中重复使用了一个名称,有时是因为“variable\u name=request.POST['variable\u name']”之类的部分 关于这个错误,我访问了多个网站,并找到了一个解决方案,即在views.py的函数中键入“variable\u name=request.POST['variable\u name']”后

下一次我尝试再次发布数据“variable\u name=request.POST['variable\u name']”时,我必须执行类似“variable\u name=request.POST.get('variable-name'、'blank\u或\u任何\u能做的事情都是sealso') 上面的语句帮助我解决了这个错误,我从StackOverflow本身的一个线程中得到了这个解决方案,这是一个非常有用的站点

现在,对于这个问题,我只是想知道它们之间的区别

  • Variable\u Name=request.POST['Variable\u Name']

  • Variable\u Name=request.POST.get('Variable\u Name','Whatever')

  • 代码(views.py)如下所示:

    from django.shortcuts import render
    from . import views
    from datetime import date
    from .models import Batch, Deleted_Batch
    from django.utils.datastructures import MultiValueDictKeyError
    
    # Create your views here.
    today = date.today() 
    Date_Batch = str(today.day)+'/'+str(today.month)+'/'+str(today.year)
    
    def Reg_Batch(request):
        return render(request, 'Reg_Batch.html',{'Date_Batch':Date_Batch})
    
    def Reg_Batch_Receive(request):
        Region_Code=request.POST['Region_Code']
        Branch_Code=request.POST['Branch_Code']
        Batch_Number=request.POST['Batch_Number']
        Farm_Code=request.POST['Farm_Code']
        Farm_Status=request.POST['Farm_Status']
        Farmer_Name=request.POST['Farmer_Name']
        Farmer_Address=request.POST['Farmer_Address']
        Farmer_Phone_Number=request.POST['Farmer_Phone_Number']
        Farmer_Email=request.POST['Farmer_Email']
        return render(request, 'Reg_Batch_Receive.html')
    
    def Reg_Batch_View(request):
        Region_Code=request.POST.get('Region_Code', 'Blank')
        Branch_Code=request.POST.get('Branch_Code', 'Blank')
        Farm_Code=request.POST.get('Farm_Code', 'Blank')
        Farm_Status=request.POST.get('Farm_Status', 'Blank')
        return render(request, 'Reg_Batch_View.html',{'Region_Code':Region_Code,'Branch_Code':Branch_Code,'Farm_Code':Farm_Code,'Farm_Status':Farm_Status})
    
    def Reg_Batch_View_Receive(request):
        Date_Batch= '20/08/2000'
        Region_Code='586001'
        Branch_Code='586001'
        Batch_Number='586001'
        Farm_Code='5484712'
        Farm_Status='Active'
        Farmer_Name='Joel Liao'
        Farmer_Address='jojojojojojojo'
        Farmer_Phone_Number='8088078086'
        Farmer_Email='kuroneko@gmail.com'
        return render(request,'Reg_Batch_View_Receive.html',{'Date_Batch':Date_Batch,'Region_Code':Region_Code,'Branch_Code':Branch_Code,'Batch_Number':Batch_Number,'Farm_Code':Farm_Code,'Farm_Status':Farm_Status,'Farmer_Name':Farmer_Name,'Farmer_Address':Farmer_Address,'Farmer_Phone_Number':Farmer_Phone_Number,'Farmer_Email':Farmer_Email})
    
    def Reg_Batch_Delete(request):
        Region_Code='586001'
        Branch_Code='586001'
        Batch_Number='586001'
        Farm_Code='5484712'
        Farm_Status='Active'
        Farmer_Name='Joel Liao'
        Farmer_Address='jojojojojojojo'
        Farmer_Phone_Number='8088078086'
        Farmer_Email='kuroneko@gmail.com'
        Deleted_Batch_DataBase=Deleted_Batch({'Region_Code':Region_Code,'Branch_Code':Branch_Code,'Batch_Number':Batch_Number,'Farm_Code':Farm_Code,'Farm_Status':Farm_Status,'Farmer_Name':Farmer_Name,'Farmer_Address':Farmer_Address,'Farmer_Phone_Number':Farmer_Phone_Number,'Farmer_Email':Farmer_Email}),
        return render(request,'Reg_Batch_Delete.html',{'Batch_Number':Batch_Number})
    
    def Reg_Batch_Delete_Receive(request):
        Batch_Number='586001'
        return render(request,'Reg_Batch_Delete_Receive.html',{'Batch_Number':Batch_Number})
    

    request.POST
    是一个类似字典的对象(请参阅)

    所以如果你这样做了

    request.POST['foobar']
    
    您可以访问已发布的变量
    foobar
    。但是,如果未发布该变量,因此未在
    POST
    中设置该变量,则您将获得
    多值dictkeyerror
    。 这类似于访问未设置的默认词典中的密钥,例如

    d={}
    d['foobar']#引发异常
    
    为了避免此错误,您可以执行以下操作

    request.POST.get('foobar','default value')
    
    以获取过账字段和默认值(如果不存在)。 因此,如果未在POST数据中设置
    foobar
    ,则收到的值为
    默认值

    这类似于默认字典处理:

    d={}
    d、 get('foobar','random')#返回'random'
    
    我可以建议您至少阅读一下Python内置类型的官方文档吗?正如wfehr所回答的,
    request.POST
    是一个“类似dict的对象”“,这意味着它有一个与普通Python类似的接口
    dict
    ——这是Python中使用最多的类型之一,因此您最好知道如何使用它。FWIW,您经常会在各种文件包文档中阅读“dict-like”、“file-like”等对象,因此最好理解这意味着什么;-)