簡體   English   中英

如何在View Django中解決KeyError

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM