您必须覆盖默认登录视图并测试request.is_ajax。这是未经测试的,任何故障都留给你作为练习。在您的登录 URL 中放置这样的视图:
from django.contrib.auth.views import login as original_login
from django.conf import settings
from django.shortcuts import resolve_url
from django.contrib.auth import REDIRECT_FIELD_NAME, \
login as auth_login
import json
def custom_login(request, template_name='registration/login.html',
redirect_field_name=REDIRECT_FIELD_NAME,
authentication_form=AuthenticationForm,
current_app=None, extra_context=None):
if request.method != 'POST' or not request.is_ajax():
return original_login(request, template_name,
redirect_field, authentication_form, current_app,
extra_context)
form = AuthenticationForm(request.POST)
if form.is_valid():
auth_login(request, form.get_user())
result = {
"status": "OK",
"url": resolve_url(settings.LOGIN_REDIRECT_URL)
}
else:
result = {
"status": "error",
"errors": form.errors
}
return HttpResponse(json.dumps(result),
mime_type="application/json")
如果请求不是 POST 或者是 POST 但不是 AJAX,则诀窍是返回原始登录视图,否则返回一个 JSON 对象,用适当的 MIME 类型描述结果。