Django rest:AJAX Post无法正常工作,响应400 [英] Django rest: AJAX Post is not working, 400 response

查看:62
本文介绍了Django rest:AJAX Post无法正常工作,响应400的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

  class CartItem(models.Model):cart_id = models.CharField('购物车ID',max_length = 50)商店=模型.ForeignKey(商店)date_added = models.DateTimeField('添加日期',auto_now_add =真实)数量= models.IntegerField('Quantity',默认值= 1)产品=型号.ForeignKey(产品,)bylist = models.CharField('Item',max_length = 150,null = True,blank = True)图片= models.ImageField('照片',upload_to ='order/%Y',null =真,空白=真)image_thumb = ImageSpecField(source ='image',处理器= [Transpose(),ResizeToFill(200,200)],format ='JPEG',options = {'质量':95})comment = models.CharField('Comment',max_length = 150,null = True,blank = True)ShopSerializer类(serializers.HyperlinkedModelSerializer):类Meta:型号=商店字段="__all__"类ProductsSerializer(serializers.HyperlinkedModelSerializer):类Meta:型号=产品字段="__all__"类CartItemSerializer(serializers.HyperlinkedModelSerializer):类Meta:型号= CartItem排除=('cart_id',) 

尝试使用json以下的内容测试POST调用,但得到400-错误的请求.尝试了许多不同的方法,但无法解决.请帮助

  function create_post(shop,pd){jQuery.ajax({输入:"POST",beforeSend:函数(请求){request.setRequestHeader("X-CSRF-TOKEN","$ {__ csrf.token}");},网址:"/api/cart/",数据:JSON.stringify({"shop":"http://127.0.0.1:8000/api/shop/1/","product":"http://127.0.0.1:8000/pd/10/",}),//console.log(data);成功:功能(结果){console.log(成功!");}});} 

还尝试过json:

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

我的url conf;

  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):型号= CartItemqueryset = CartItem.objects.all()serializer_class = CartItemSerializerPermission_classes = [权限.允许]def perform_create(self,serializer):打印'create_view_invoked'如果self.request.session.get(CART_ID_SESSION_KEY,'')=='':self.cart_id =''字符='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890!@#$%^& *()'cart_id_length = 50对于范围内的y(cart_id_length):self.cart_id + =个字符[random.randint(0,len(characters)-1)]打印self.cart_idself.request.session [CART_ID_SESSION_KEY] = self.cart_id打印self.request.session [CART_ID_SESSION_KEY]serializer.save(cart_id = self.request.session [CART_ID_SESSION_KEY])def get_queryset(self):打印'get_view_invoked'如果self.request.session.get(CART_ID_SESSION_KEY,'')=='':self.cart_id =''别的:self.cart_id = self.request.session [CART_ID_SESSION_KEY]打印self.cart_id返回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 

解决方案

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

尝试添加:

  dataType:"json",contentType:应用程序/json" 

现在Django将知道您正在发布 json 这就是您要寻找的.

I am newbie to DRF and Ajax, my serializer code

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',)

Trying to test the POST call with below json, but getting 400 - Bad request. Tried many different ways but couldn't solve. Please help

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!");
   }
});
}

Also Tried with json:

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

EDIT: my url conf;

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'),

view:

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)

Forgot to mention, it is working fine directly from DRF API UI (http://127.0.0.1/api/cart/).

I am not seeing any errors in django, only 400 is shown in log.

[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

解决方案

HTTP 400 is Bad Request which means that Django is unable to understand the request.

Try adding:

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

Now Django will know that you are posting json This is what you are looking for.

这篇关于Django rest:AJAX Post无法正常工作,响应400的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆