异常值:字段 'id' 需要一个数字,但得到 <WSGIRequest: POST '/api/checkout/'>

时间:2021-03-12 21:25:10

标签: javascript python django vue.js

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

我已经解决了这个问题,现在它给了我:JSONDecodeError at /api/checkout/, Expecting value: line 1 column 1 (char 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

1 个答案:

答案 0 :(得分:0)

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

UPD1:请先打印 request.body 中的内容,然后再尝试解析它。我认为那里缺少某些东西。