Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jquery 如何在django中访问基于类的视图的put请求中的数据表单_Jquery_Python_Ajax_Django - Fatal编程技术网

Jquery 如何在django中访问基于类的视图的put请求中的数据表单

Jquery 如何在django中访问基于类的视图的put请求中的数据表单,jquery,python,ajax,django,Jquery,Python,Ajax,Django,我目前在访问存储在数据表单中的数据时遇到问题。我将通过ajax传递它,并通过views.py中的put方法接收它。问题是我只知道如何通过request.POST[“item_name”]和file request.FILES[“photo”]访问它。但显然,这在put请求中不起作用。有人能帮忙吗 jQuery const form = new FormData(); const name = $('#edit-product-name-input-' + productID).val(); co

我目前在访问存储在数据表单中的数据时遇到问题。我将通过ajax传递它,并通过views.py中的put方法接收它。问题是我只知道如何通过request.POST[“item_name”]和file request.FILES[“photo”]访问它。但显然,这在put请求中不起作用。有人能帮忙吗

jQuery

const form = new FormData();
const name = $('#edit-product-name-input-' + productID).val();
const quantity = $('#edit-product-quantity-input-' + productID).val();
const description = $('#edit-product-description-input-' + productID).val();
const price = $('#edit-product-price-input-' + productID).val();
const photo = $('#edit-product-photo-' + productID);

if (extractPhoto(photo)) {
    form.append('photo', extractPhoto(photo));
}
form.append('name', name);
form.append('price', price);
form.append('description', description);
form.append('quantity', quantity);
form.append('product_id', productID);

attachCSRF();
$.ajax({
    url: window.location.pathname + "products/",
    method: "PUT",
    data: form,
    contentType: false,
    processData: false,
    success: function (data) {
        alert(data["product"] + " edited");
        location.reload();
    },
    error: function (data) {
        if (data.responseJSON) {
            displayErrors(data.responseJSON);
        }
    }
视图.py

@staticmethod
def put(request, stall_id):
    dict = {
        "product_name": request.body('name'),
        "description": request.body('description'),
        "price": request.body('price'),
        "quantity": request.body('quantity')
    }
    errors = handle_errors(dict)
    print(errors)

    if not errors:
        product = Product.objects.get(id=request.POST.get("product_id"))
        product.name = dict["product_name"]
        product.description = dict["description"]
        product.price = dict["price"]
        product.quantity = dict["quantity"]
        if 'photo' in request.FILES:
            product.photo = request.FILES.get('photo')
        product.save()


        data = {
            "product": product.name
        }

        return HttpResponse(
            json.dumps(data),
            content_type="application/json"
        )

    return HttpResponse(
        json.dumps(errors),
        content_type="application/json",
        status=400
    )

通过
x-www-form-urlencoded
发送数据时,它看起来像是在
request.body
下以字节的形式到达的

**不要在您的代码中使用
csrf\u豁免
,我只是出于测试目的使用它**

以下内容适合我:

from django.http import QueryDict


class Some(View):
    @csrf_exempt
    def dispatch(self, request, *args, **kwargs):
        return super().dispatch(request, *args, *kwargs)

    def put(self, request, *args, **kwargs):
        data = QueryDict(request.body)
        print(data)
        return HttpResponse("Worked!")
data
变量是一个
dict
,因此您可以在put中执行此操作:

form = {
    "product_name": data.get('name'),
    "description": data.get('description'),
    "price": data.get('price'),
    "quantity": data.get('quantity')
}

我也遇到了同样的问题,而且做
QueryDict(request.body)
对我不起作用

最后我做的是:

from django.http.multipartparser import MultiPartParser
put_data = MultiPartParser(request.META, request, request.upload_handlers).parse() # it will return a tuple object
put = put_data[0] # it will give you the QueryDict object with your form data.

您好,谢谢您的回复!我编辑了这个,实际上我在用ajax发送表单。它还会继续工作吗?在我的表单中,我有一个想象,这可能是导致我出现问题的原因。请使用
QueryDict
对象解析表单
request.body
,看看是否有效,但请记住使用dict语法
[key\u name]
.get(key\u name)更新代码以访问数据
。哦,对了,我完全忘了。谢谢!我尝试将其作为一个函数访问,该函数带有一个参数,用于
PUT
POST
方法,数据应该以相同的方式传递,尝试
print request.data
并查看数据即将到来。用于PUT和POST使用
request.data['keyName']