我正在学习Django的网络编程。目前我正在尝试构建一个用户可以更新其用户配置文件的网页(例如电子邮件,昵称)。我正在使用ajax来处理这些数据。但我想出了一个问题,我怎样才能获得详细的ajax错误信息?
例如,用户想要更新他的昵称或电子邮件,但他发布的昵称或电子邮件已经存在于数据库中。在ajax中,我使用error:function (XMLHttpRequest, textStatus, errorThrown) {}
来获取错误信息。但我只是得到类似“500内部服务器错误”的内容。但是,在浏览器控制台中,我可以看到“昵称”或“电子邮件”是否重复。所以我想知道如何才能知道哪一个是重复的?
我的view.py是:
@login_required
def edit_usr_profile(request):
user = request.user
objs = UserProfile.objects.filter(usr=user)
usr_objs = UserProfile.objects.get(usr=user)
if request.method == 'POST':
if request.is_ajax():
usr_objs.nickname = request.POST.get('nickname')
usr_objs.email = request.POST.get('email')
usr_objs.save()
return render(request, 'account/edit_profile.html', {'objs':objs})
我的ajax代码是:
$.ajax({
type:'POST',
url:'./',
data:{
async: false,
nickname:usr_nickname,
email:usr_email,
csrfmiddlewaretoken:$('input[name=csrfmiddlewaretoken]').val()
},
success:function () {
alert('New profile saved!')
//window.location.reload()
},
error:function (XMLHttpRequest, textStatus, errorThrown) {
alert('Error! Please check your entry and try again!')
}
})
如果你能帮助我,我将非常感激!
这对于初学者来说是一个非常大的问题。通常,后端部分应该确定一切是否正常并将状态代码/结果/等发送到JavaScript部分。
#THIS CODE MAY NEEDS SOME MODIFY TO PUT IN USE.
@login_required
def edit_usr_profile(request):
# AN RESULT DICT THAT SAVES YOUR STATUS INFO
result = collections.OrderedDict()
result['code'] = "-1"
result['message'] = ""
result['data'] = ""
user = request.user
objs = UserProfile.objects.filter(usr=user)
usr_objs = UserProfile.objects.get(usr=user)
if request.method == 'POST':
if request.is_ajax():
try:
usr_objs.nickname = request.POST.get('nickname')
usr_objs.email = request.POST.get('email')
usr_objs.save()
# CHANGE THE INFO AND STATUS AS YOUR WISH
result['code'] = "1"
result['message'] = "Success"
except Exception as e:
# SAVES THE ERROR INFO
result['code'] = "-1"
result['message'] = "Failed with error:"+str(e)
# RETURN THE RESULT DICT
return render(request, 'account/edit_profile.html', {'objs':objs,'resultInfo':result})
然后,您只需要判断JavaScript中的“代码”部分,并确定是否显示信息。
通常,Web应用程序不应该有500个错误作为其功能的一部分。尝试使用“Try-catch”机制来避免它。