MultiValueDictKeyError Метод запроса: GET (Django) - PullRequest
1 голос
/ 21 апреля 2020

Я недавно начал учиться и работать над Django Я сталкивался с этой ошибкой несколько раз, иногда это происходило из-за повторяющегося использования имени в html, а иногда из-за части, например "variable_name = request .POST ['variable_name'] "Я посетил различные сайты по поводу этой ошибки и смог найти решение, т. Е. Как только я набрал« variable_name = request.POST ['variable_name'] »в функции в views.py

в следующий раз, когда я снова попытался отправить данные "variable_name = request.POST ['variable_name']", мне пришлось сделать что-то вроде этого ') Вышеупомянутое утверждение помогло мне решить эту ошибку. Я получил это решение от A Thread в самом StackOverflow. Весьма полезный сайт.

Теперь для вопроса мне просто интересно узнать, в чем разница между

  1. Variable_Name = request.POST ['Variable_Name'] *

  2. Variable_Name = request.POST.get ('Variable_Name', 'W что угодно ')

Код (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})

1 Ответ

2 голосов
/ 21 апреля 2020

request.POST является словарным объектом (см. документы ).

Так что если вы сделаете

request.POST['foobar']

, вы сможете получить доступ к опубликованной переменной foobar. Но если это не опубликовано и поэтому не установлено внутри POST, вы получите MultiValueDictKeyError. Это похоже на доступ к ключу внутри словаря по умолчанию, который не установлен, например,

d = {}
d['foobar']  # raises Exception

Чтобы избежать этой ошибки, вы можете затем сделать

request.POST.get('foobar', 'default-value')

, чтобы получить опубликованное поле и значение по умолчанию, если оно отсутствует. Так что если foobar не установлен внутри ваших POST-данных, полученное значение будет default-value.

Это похоже на обработку словаря по умолчанию:

d = {}
d.get('foobar', 'random')  # returns 'random'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...