【问题标题】:HttpResponse error during ajax post request in djangoDjango中的ajax发布请求期间的HttpResponse错误
【发布时间】:2016-07-19 17:15:39
【问题描述】:

朋友们,我正在尝试在 django 中使用 ajax 处理表单提交。我一直收到这个错误,上面写着,

The view auths.change_profile.change_username didn't return an HttpResponse object. It returned None instead.

这是我的 change_profile.py

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 语句的顺序。从技术上讲,请求是 ajax,所以它会返回第一个 if 语句。它不会执行第二个。无论如何,这是我的信念。尝试在其中添加print 语句进行检查。
  • 我添加了对 GET 请求的检查,但我仍然收到相同的错误。虽然 GET 在 ajax 上运行良好,但 POST 存在这个问题
  • 你使用的是什么版本的 Django?

标签: jquery ajax django


【解决方案1】:

删除这个

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

【讨论】:

  • 我认为你需要看看你的答案。你认为 python 控制语句有花括号吗?
  • 我的错,我看到了 javascript 代码并将其作为您的 python 代码阅读。为错误道歉。该解决方案对您有用吗?
  • 这次我仔细地编辑了我的答案。试试看。这次应该可以了。在这里查看我处理 POST 类型的 AJax 请求的 views.py sn-p -> github.com/amyth/hammer/blob/master/apps/overseer/views.py 转到 sn-p 中的“addnew_inst_form_submit()”函数。
【解决方案2】:

尝试这样做:

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 是推荐的格式。 Pre 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)

【讨论】:

  • @amankarn 看看我的新代码是否有效。如果不是,那肯定不是风景
猜你喜欢
  • 2018-01-05
  • 1970-01-01
  • 2020-10-30
  • 1970-01-01
  • 2015-03-10
  • 1970-01-01
  • 2014-05-14
  • 1970-01-01
  • 2016-08-29
相关资源
最近更新 更多