【问题标题】:Exception Value: Field 'id' expected a number but got <WSGIRequest: POST '/api/checkout/'>异常值:字段 'id' 需要一个数字,但得到 <WSGIRequest: POST '/api/checkout/'>
【发布时间】:2021-06-10 21:56:39
【问题描述】:

我在 Django 中通过 Vue.js 传递 Post 请求时遇到问题。当我尝试填写表格并单击购买时,它不断收到此错误。我正在做的是通过 api 传递它并尝试将其发送到数据库并将其保存在那里。该页面继续正常工作,但在后台没有任何反应。在控制台中显示错误 500,单击网络时会显示所有这些信息。我在构建自己的东西时一直在学习本教程:https://www.youtube.com/watch?v=2Ed3fTYcx-w&list=PLpyspNLjzwBmIDrDOaPkLLuy5YDDNW9SA&index=8&ab_channel=CodeWithStein

我已经解决了这个问题,现在它告诉我:/api/checkout/ 处的 JSONDecodeError,预期值:第 1 行第 1 列(字符 0)

        var productapp = new Vue({
            el:'#cartapp',
            delimiters:['[[', ']]'],
            store: store,
            data() {
                return {
                    first_name: '',
                    last_name: '',
                    birth_date: '',
                    phone: '',
                    email: '',
                    city: '',
                    region: '',
                    address: '',
                    references: '',

                    products: [{{productsstring|safe}}]
                }
            },
            computed: {
                numItems: function() {
                    return store.state.numItems
                },
                totalCost: function() {
                    return store.state.totalCost
                }
            },
            methods: {
                submitForm() {

                    var data = {
                        'first_name': this.first_name,
                        'last_name': this.last_name,
                        'birth_date': this.birth_date,
                        'phone': this.phone,
                        'email': this.email,
                        'city': this.city,
                        'region': this.region,
                        'address': this.address,
                        'references': this.references,
                    };

                    fetch('/api/checkout/', {
                        method: 'POST',
                        headers: {
                            'Content-Type': 'application/json',
                            'X-CSRFToken': '{{ csrf_token }}'
                        },
                        credentials: 'same-origin',
                        body: JSON.stringify(data),
                    })
                    .then((response) => {
                        console.log('success')
                        console.log(response)
                    })
                    .catch(function (error) {
                        console.log('Error 2');
                    })
API.PY FILE:

import json
from django.http import JsonResponse
from cart.models import Cart
from .models import Product
from order.models import Order, OrderItem
from order.utils import checkout
from django.shortcuts import get_object_or_404, redirect

def api_checkout(request):
    cart = Cart(request)
    data = json.loads(request.body)
    jsonresponse = {'success': True}

    first_name = data['first_name']
    last_name = data['last_name']
    birth_date = data['birth_date']
    phone = data['phone']
    email = data['email']
    city = data['city']
    region = data['region']
    address = data['address']
    references = data['references']

    orderid = checkout(request, first_name, last_name, birth_date, phone , email, city, region, address, references)
    paid = True

    if paid == True:
        order = Order.objects(pk=orderid)
        order.paid = True
        order.paid_amount = cart.get_total_cost()
        order.save()

        cart.clear()
    
    return JsonResponse(jsonresponse)
    
    
UTILS.PY FILE:


import datetime
import os
from random import randint
from cart.models import Cart
from .models import Order, OrderItem

def checkout(request, first_name, last_name, birth_date, phone, email, city, region, address, references):
    order = Order(first_name=first_name,  last_name=last_name, birth_date=birth_date, phone=phone, email=email, city=city, region=region, address=address, references=references)
    order.save()
    cart = Cart(request)
    for item in cart:
        OrderItem.objects.create(order=order, product=item['product'], price=item['price'], quantity=item['quantity'])
        return order.id
Environment:


Request Method: POST
Request URL: http://127.0.0.1:8000/api/checkout/

Django Version: 3.1.7
Python Version: 3.9.0
Installed Applications:
['order.apps.OrderConfig',
 'cart.apps.CartConfig',
 'crispy_forms',
 'ckeditor',
 'shop.apps.ShopConfig',
 'categories.apps.CategoriesConfig',
 'pages.apps.PagesConfig',
 'blog.apps.BlogConfig',
 'django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles']
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']

enter image description here

【问题讨论】:

    标签: javascript python django vue.js


    【解决方案1】:

    可能发生在这里:order = Order(request... 为什么要将 request 对象传递给 Order 模型?它不期待这样的论点。只需在checkout 函数中创建新的Order 时将其删除即可修复。

    UPD1:请在尝试解析之前打印request.body 中的内容。我认为那里缺少一些东西。

    【讨论】:

    • 现在它给了我:/api/checkout/ 处的 JSONDecodeError 期望值:第 1 行第 1 列(字符 0) 请求方法:GET 请求 URL:127.0.0.1:8000/api/checkout Django 版本:3.1.7 异常类型:JSONDecodeError异常值:预期值:第1行第1列(字符0)异常位置:/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/json/decoder.py,第355行,在raw_decode Python中可执行文件:/Users/IvanStepanchuk/Desktop/perulab-web/venv/bin/python
    • 这个回溯是不可读的。请用新数据更新您的主要帖子,我会更新我的答案
    • 但是,是的,谢谢,你是对的关于 Order(request,它不应该在那里。但现在我遇到了上面的问题。
    • 非常感谢您的帮助!我已将它连接到一个新数据库并开始工作。您对 Order(request...) 的看法是正确的。我再次进行了更改,现在它可以正常工作了。
    猜你喜欢
    • 1970-01-01
    • 2022-10-24
    • 2021-08-31
    • 1970-01-01
    • 2022-08-23
    • 2021-07-03
    • 2021-06-03
    • 2021-01-22
    • 2021-01-22
    相关资源
    最近更新 更多