【问题标题】:Form validation error in django form without refreshing the pagedjango表单中的表单验证错误而不刷新页面
【发布时间】:2015-02-06 16:21:08
【问题描述】:

我被这个问题困住了。我想显示在表单中发现的任何验证错误,例如用户未退出,或密码错误等,以显示在登录/注册表单上,而无需重新加载页面。

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

请帮忙。

【问题讨论】:

  • 如果您想要这种行为,请设计您的应用程序 API 优先样式。这样,HTML 版本只是移动或服务器到服务器应用程序使用的相同 API 的客户端。 AngularJSEmberJS 成为 Django Rest Framework 的优秀客户。

标签: django forms validation page-refresh


【解决方案1】:

如果您打算只在少数地方进行此类交互而无需重新加载页面,则可以避免使用 Django Rest Framework 和 Ember/Angular/React 等。

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

如果您打算拥有大量交互式功能,您应该真正考虑使用 Angular/Ember/React 并使用 Django 构建 API,如 cmets 中针对您的问题提供的那样。

【讨论】:

    【解决方案2】:

    您必须覆盖默认登录视图并测试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 类型描述结果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-11
      • 1970-01-01
      • 1970-01-01
      • 2015-07-31
      • 2020-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多