如何解决视图Djang中的关键错误

2024-06-01 20:39:58 发布

您现在位置:Python中文网/ 问答频道 /正文

当我试图呈现一个视图时,我收到一条错误消息“KeyError at/manifest”。我是第一次使用会话,所以我不知道如何解决这个问题。我正在尝试使用会话将字段“reference”从edit_manifest_frombrowse视图传递到manifest视图。有人能给我解释一下是什么导致了这个错误,以及为什么我要修正它吗?代码和完整回溯如下:

你知道吗视图.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)

你知道吗表单.py你知道吗

class CreateManifestForm(forms.ModelForm):
    class Meta:
        model = Manifests
        fields = ('reference', 'cases', 'product_name', 'count', 'CNF', 'FOB')

你知道吗型号.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'

Tags: djangopyformidgetresponserequestcontrib
1条回答
网友
1楼 · 发布于 2024-06-01 20:39:58

出现此错误是因为这是pop方法的行为。你知道吗

pop(key[, default]): If key is in the dictionary, remove it and return its value, else return default. If default is not given and key is not in the dictionary, a KeyError is raised.

所以要解决这个问题,可以使用回退来消除这个错误。例如:

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 queryset解析为表单的类似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))

希望有帮助!你知道吗

相关问题 更多 >