django表单中的表单验证错误,无需刷新页面

时间:2014-12-08 21:54:30

标签: django forms validation page-refresh

我遇到了问题。我想显示在表单中找到的任何验证错误,例如用户不退出,或者在登录/注册表单上显示错误的密码等而不重新加载页面。

我能够提交表单但找不到在表单中显示错误消息的方法。

请帮忙。

2 个答案:

答案 0 :(得分:1)

如果您计划在没有页面重新加载的情况下只有少数地方进行此类交互,则可以避免使用Django Rest Framework和Ember / Angular / React等。

  • 关于用户输入使用javascript
  • 进行ajax请求
  • 在服务器上,您的视图可以使用request.is_ajax()方法识别AJAX请求,并且您可以验证表单
  • 如果一切正常,您可以返回状态确定
  • 如果出现错误,您可以使用字段返回JSON对象:“错误消息”

如果你计划拥有很多互动功能,你应该考虑使用Angular / Ember / React并使用Django构建一个API,就像你的问题的评论一样。

答案 1 :(得分:1)

您必须覆盖默认登录视图并测试request.is_ajax。这是未经测试的,任何故障都留给你作为练习。在您的登录网址上放置这样的视图:

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,则返回原始登录视图,否则返回描述具有相应MIME类型的结果的JSON对象。