Jquery django中的ajax post请求期间出现HttpResponse错误

Jquery django中的ajax post请求期间出现HttpResponse错误,jquery,ajax,django,Jquery,Ajax,Django,朋友们,我正在尝试在django中使用ajax处理表单提交。我得到了一个错误,它说 The view auths.change_profile.change_username didn't return an HttpResponse object. It returned None instead. 这是我的零钱 def change_username(request): if request.is_ajax() and request.method == 'GET':

朋友们,我正在尝试在django中使用ajax处理表单提交。我得到了一个错误,它说

The view auths.change_profile.change_username didn't return an HttpResponse object. It returned None instead.
这是我的零钱

def change_username(request):
    if request.is_ajax() and request.method == 'GET':
        return render(request,"auths/edits/edit_username.html",{})
    elif request.method == 'POST' and request.is_ajax():
        username = request.POST['username']
        user = User.objects.get(username=request.user.username)
        user.username = username
        user.save()
        if user.save():
            data = "Username successfully updated"
        else:
            data = "Something went wrong!"
        return HttpResponse(json.dumps({'data':data}), content_type="application/json")
我的ajax.js如下

$(document).ready(
    $('#username_form').submit(function(){
    $.ajax({
        type:"POST",
        url:'/change_username/',
        data:{
                'csrfmiddlewaretoken':$('input[name=csrfmiddlewaretoken]').val()
        },
        success:function(data){
            $('#username').html(data);
        }
    });
});
);
我哪里出错了?

删除此项

if request.is_ajax():
    return render(request,"auths/edits/edit_username.html",{})
您不需要它,因为从技术上讲,Ajax请求也是POST或GET类型的。 因此,您所需要的是:

if request.method == 'POST':
    username = request.POST['username']
    user = User.objects.get(username=request.user.username)
    user.username = username
    user.save()
    if user.save():
        data = "Username successfully updated"
    else:
        data = "Something went wrong!"
    return HttpResponse(json.dumps({'data':data}))
else:
    json.dumps({"nothing to see": "this isn't happening"})
去掉这个

if request.is_ajax():
    return render(request,"auths/edits/edit_username.html",{})
您不需要它,因为从技术上讲,Ajax请求也是POST或GET类型的。 因此,您所需要的是:

if request.method == 'POST':
    username = request.POST['username']
    user = User.objects.get(username=request.user.username)
    user.username = username
    user.save()
    if user.save():
        data = "Username successfully updated"
    else:
        data = "Something went wrong!"
    return HttpResponse(json.dumps({'data':data}))
else:
    json.dumps({"nothing to see": "this isn't happening"})
尝试这样做:

from django.http import JsonResponse

def change_username(request):
    if request.is_ajax() and request.method == 'GET':
        return render(request, "auths/edits/edit_username.html", {})
    elif request.is_ajax() and request.method == 'POST':
        username = request.POST['username']
        user = User.objects.get(username=request.user.username)
        user.username = username
        user.save()
        if user.save():
            data = "Username successfully updated"
        else:
            data = "Something went wrong!"
        return JsonResponse({'data': data})
Django 1.7之后,建议使用
JsonResponse
格式。1.7之前的版本是您最初使用的方法

让我知道这是否有效

编辑(尝试2):

from django.http import JsonResponse
from django.shortcuts import get_object_or_404
from django.views.decorators.http import require_http_methods


@require_http_methods(['POST'])
def change_username(request):
    if not request.is_ajax():
        return render(request, "auths/edits/edit_username.html", {})
    else:
        new_username = request.POST.get('username')
        user = get_object_or_404(User, id=request.user.id)
        initial_username = user.username
        user.username = new_username
        user.save()

        data = {}

        if user.username == new_username:
            data['data'] = "Username successfully updated!"
        else:
            data['data'] = "Something went wrong!"

        return JsonResponse(data)
尝试这样做:

from django.http import JsonResponse

def change_username(request):
    if request.is_ajax() and request.method == 'GET':
        return render(request, "auths/edits/edit_username.html", {})
    elif request.is_ajax() and request.method == 'POST':
        username = request.POST['username']
        user = User.objects.get(username=request.user.username)
        user.username = username
        user.save()
        if user.save():
            data = "Username successfully updated"
        else:
            data = "Something went wrong!"
        return JsonResponse({'data': data})
Django 1.7之后,建议使用
JsonResponse
格式。1.7之前的版本是您最初使用的方法

让我知道这是否有效

编辑(尝试2):

from django.http import JsonResponse
from django.shortcuts import get_object_or_404
from django.views.decorators.http import require_http_methods


@require_http_methods(['POST'])
def change_username(request):
    if not request.is_ajax():
        return render(request, "auths/edits/edit_username.html", {})
    else:
        new_username = request.POST.get('username')
        user = get_object_or_404(User, id=request.user.id)
        initial_username = user.username
        user.username = new_username
        user.save()

        data = {}

        if user.username == new_username:
            data['data'] = "Username successfully updated!"
        else:
            data['data'] = "Something went wrong!"

        return JsonResponse(data)

我想你需要看看你的答案。你认为python控制语句有大括号吗?糟糕的是,我看到了javascript代码,并将其作为python代码阅读。为这个错误道歉。这个解决方案对你有用吗?这次我仔细地编辑了我的答案。试试看。这次应该行得通。请参见此处处理POST类型AJax请求的my views.py代码段->转到代码段中的“addnew\u inst\u form\u submit()”函数。我认为您需要查看您的答案。你认为python控制语句有大括号吗?糟糕的是,我看到了javascript代码,并将其作为python代码阅读。为这个错误道歉。这个解决方案对你有用吗?这次我仔细地编辑了我的答案。试试看。这次应该行得通。请参见此处处理POST类型AJax请求的my views.py代码段->转到代码段中的“addnew_inst_form_submit()”函数。我认为您需要更改原始
if
语句的顺序。从技术上讲,请求是ajax,因此它将返回第一条if语句。它不会执行第二个。这是我的信念。尝试将
print
语句放在那里进行检查。我添加了GET请求的检查,但仍然收到相同的错误。虽然GET在ajax上做得很好,但是在post上有一个问题,您使用的是哪个版本的Django?我认为您需要更改原始
if
语句的顺序。从技术上讲,请求是ajax,因此它将返回第一条if语句。它不会执行第二个。这是我的信念。尝试将
print
语句放在那里进行检查。我添加了GET请求的检查,但仍然收到相同的错误。虽然GET在ajax上做得很好,但是post上有一个问题,您使用的是哪个版本的Django?@amankarn,看看我的新代码是否有效。如果不是,那肯定不是问题view@amankarn看看我的新代码是否有效。如果不是,那绝对不是风景