[英]How to Solve KeyError in View Django
當我嘗試渲染視圖時,出現錯誤消息“ / manifest處的KeyError”。 我是第一次使用會話,因此不確定如何解決此問題。 我正在嘗試使用會話將字段“引用”從edit_manifest_frombrowse
視圖傳遞到manifest
視圖。 有人可以向我解釋是什么導致了此錯誤,為什么我可以修復它? 代碼和完整的回溯如下:
views.py
def edit_manifest_frombrowse(request, pk):
item = get_object_or_404(Manifests, pk=pk)
if request.method == "POST":
form = CreateManifestForm(request.POST, instance=item)
if form.is_valid():
request.session["reference"] = form.cleaned_data["reference"]
return redirect('manifest')
else:
form = CreateManifestForm(instance=item)
return render(request, 'edit_manifest_frombrowse.html', {'form': form})
def manifest(request):
form = CreateManifestForm(request.POST)
if request.method == "POST":
...
reference_id = request.session.pop('reference', None)
data = Manifests.objects.all().filter(reference__reference=reference_id)
form = CreateManifestForm(initial={
'reference': Orders.objects.get(reference=reference_id),
})
total_cases = Manifests.objects.filter(reference__reference=reference_id).aggregate(Sum('cases'))
context = {
'reference_id': reference_id,
'form': form,
'data': data,
'total_cases': total_cases['cases__sum'],
}
return render(request, 'manifest_readonly.html', context)
表格
class CreateManifestForm(forms.ModelForm):
class Meta:
model = Manifests
fields = ('reference', 'cases', 'product_name', 'count', 'CNF', 'FOB')
models.py
#form which I am trying to submit
class Manifests(models.Model):
reference = models.ForeignKey(Orders)
#just showing so you can see what the FK reference
class Orders(models.Model):
reference = models.CharField(max_length=50, unique=True)
完整追溯
Request Method: GET
Request URL: http://127.0.0.1:8000/manifest
Django Version: 1.11
Python Version: 2.7.10
Installed Applications:
['django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'django.contrib.humanize',
'bootstrap_modal_forms',
'smart_selects',
'unit']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware']
Traceback:
File "/Library/Python/2.7/site-packages/django/core/handlers/exception.py" in inner
41. response = get_response(request)
File "/Library/Python/2.7/site-packages/django/core/handlers/base.py" in _get_response
187. response = self.process_exception_by_middleware(e, request)
File "/Library/Python/2.7/site-packages/django/core/handlers/base.py" in _get_response
185. response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/Users/andrews/Desktop/WBU/web_unit/unit/views.py" in manifest
325. reference_id = request.session.pop('reference')
File "/Library/Python/2.7/site-packages/django/contrib/sessions/backends/base.py" in pop
73. return self._session.pop(key, *args)
Exception Type: KeyError at /manifest
Exception Value: 'reference'
您收到此錯誤,因為這是pop方法的行為。
pop(key [,default]) :如果key在字典中,請將其刪除並返回其值,否則返回default。 如果未提供默認值,並且字典中沒有key,則會引發KeyError。
因此,要解決該問題,您可以使用后備方法擺脫此錯誤。 例如:
reference_id = request.session.pop("reference", None)
您的邏輯有問題可能是導致您導致此錯誤的根本原因。
if form.is_valid():
request.session["reference"] = form.cleaned_data["reference"]
return redirect('manifest')
如果您的表單無效,那么您將不會在會話變量上進行reference
,因此無法在manifest
視圖中獲取它。 因此,請嘗試重定向到另一個視圖或嘗試執行以下操作:
if form.is_valid():
# Do other stuff
request.session["reference"] = form.cleaned_data["reference"]
else:
# Do other stuff
request.session["reference"] = ""
return redirect('manifest')
當您要使用查詢集啟動時,表單還有另一個問題。 它將嘗試將您的Orders查詢集解析為表單的類似JSON的數據,這將提示錯誤。 您應該嘗試為reference
字段創建替代字段,並在init方法上為該字段設置queryset,如下所示:
# forms.py
class CreateManifestForm(forms.ModelForm):
reference = forms.ModelChoiceField(queryset=Orders.objects.none())
class Meta:
model = Manifests
fields = ('reference', 'cases', 'product_name', 'count', 'CNF', 'FOB')
def __init__(self, reference, *args, **kwargs):
super(CreateManifestForm, self).__init__(*args, **kwargs)
self.fields['reference'].queryset = reference
然后,您可以像這樣啟動表單:
form = CreateManifestForm(reference=Orders.objects.filter(reference=reference_id))
希望有幫助!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.