【问题标题】:Django rest: AJAX Post is not working, 400 responseDjango rest:AJAX Post 不工作,400 响应
【发布时间】:2017-08-28 11:51:16
【问题描述】:

我是 DRF 和 Ajax 的新手,我的序列化程序代码

class CartItem(models.Model):
    cart_id = models.CharField('Cart ID', max_length=50)
    shop =   models.ForeignKey(Shop)
    date_added = models.DateTimeField('Added on', auto_now_add=True)
    quantity = models.IntegerField('Quantity', default=1)
    product = models.ForeignKey(Products,)
    bylist = models.CharField('Item', max_length=150, null=True, blank=True)
    image = models.ImageField('Photo', upload_to='order/%Y',null=True, blank=True)
    image_thumb        =   ImageSpecField(source='image',
                                            processors=[Transpose(),ResizeToFill(200, 200)],
                                            format='JPEG',
                                        options={'quality': 95})
    comment = models.CharField('Comment', max_length=150, null=True, blank=True)

class ShopSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Shop
        fields = "__all__"

class ProductsSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Products
        fields = "__all__"          

class CartItemSerializer(serializers.HyperlinkedModelSerializer):

    class Meta:
        model = CartItem
        exclude = ('cart_id',)

尝试使用以下 json 测试 POST 调用,但收到 400 - 错误请求。尝试了许多不同的方法,但无法解决。请帮忙

function create_post(shop, pd) {    
    jQuery.ajax({
            type: "POST",
            beforeSend: function (request)
            {
                request.setRequestHeader("X-CSRF-TOKEN", "${_csrf.token}");
            },
            url: "/api/cart/",
            data: JSON.stringify({"shop":"http://127.0.0.1:8000/api/shop/1/","product":"http://127.0.0.1:8000/pd/10/",}),
            //console.log(data);
            success : function(result) {
            console.log("Success!");
   }
});
}

也尝试使用 json:

var json = '{"shop":'+1+',"product":'+2+',"quantity": null,"bylist": "","image": null,"comment": "",}'

编辑:我的网址配置;

url(r'^api/cart/$', views.CartItemList.as_view(), name='cartitem-list'),
    url(r'^api/cart/(?P<pk>\w+)/$', views.CartItemDetail.as_view(), name='cartitem-detail'),
    url(r'^api/shop/(?P<pk>\w+)/$', views.ShopDetail.as_view(), name='shop-detail'),
    url(r'^api/pd/(?P<pk>\w+)/$', views.ProductsDetail.as_view(), name='products-detail'),

查看:

class CartItemList(generics.ListCreateAPIView):
    model = CartItem
    queryset = CartItem.objects.all()
    serializer_class = CartItemSerializer
    permission_classes = [
        permissions.AllowAny
    ]
    def perform_create(self, serializer):
        print 'create_view_invoked'
        if self.request.session.get(CART_ID_SESSION_KEY,'') == '':
            self.cart_id = ''
            characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890!@#$%^&*()'
            cart_id_length = 50
            for y in range(cart_id_length):
                self.cart_id += characters[random.randint(0, len(characters)-1)]
            print self.cart_id
            self.request.session[CART_ID_SESSION_KEY] = self.cart_id
        print self.request.session[CART_ID_SESSION_KEY]
        serializer.save(cart_id=self.request.session[CART_ID_SESSION_KEY])

    def get_queryset(self):
        print 'get_view_invoked'
        if self.request.session.get(CART_ID_SESSION_KEY,'') == '':
            self.cart_id=''        
        else:
            self.cart_id = self.request.session[CART_ID_SESSION_KEY]
            print self.cart_id
        return CartItem.objects.filter(cart_id=self.cart_id)

忘了提一下,直接从 DRF API UI (http://127.0.0.1/api/cart/) 可以正常工作。

我在 django 中没有看到任何错误,日志中只显示 400。

[03/Apr/2017 19:28:04] "POST /api/cart/ HTTP/1.1" 400 74
[03/Apr/2017 19:28:07] "POST /api/cart/ HTTP/1.1" 400 74
[03/Apr/2017 19:28:09] "POST /api/cart/ HTTP/1.1" 400 74

【问题讨论】:

  • 哪个视图提供此网址"/api/cart/"?请同时添加。
  • 始终包含相关的错误/警告,让社区提供更好的帮助。此外,您不需要stringify 数据。
  • 添加了我的 url conf 和视图
  • @AKS 已添加
  • @ShikharChauhan,没有错误,只有 400 显示,粘贴在上面的线程中。

标签: javascript ajax django django-rest-framework


【解决方案1】:

HTTP 400Bad Request,这意味着 Django 无法理解请求。

尝试添加:

  dataType: "json",
  contentType: "application/json"

现在 Django 会知道你在发帖 json 这就是你要找的。​​p>

【讨论】:

  • 谢谢Shikhar,我添加了上面,还用完整的url更改了相关字段(data: JSON.stringify({"shop":"/api/shop/2/","product" :"/api/pd/10/",}), ) 现在已修复。非常感谢。
  • 如果答案解决了问题请参考this
  • 谢谢Shikhar,我添加了上面,还用完整的url更改了相关字段(data: JSON.stringify({"shop":"/api/shop/2/","product" :"/api/pd/10/",}), ) 现在已修复。非常感谢。现在我正在寻找在模板中获取购物车详细信息(计数和最近添加的项目)、任何线索、服务器端计数或客户端计数以及如何处理删除的项目。谢谢
猜你喜欢
  • 2017-09-25
  • 2021-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-06
  • 2013-04-14
  • 2017-04-16
相关资源
最近更新 更多