【问题标题】:Django server side AJAX validationDjango 服务器端 AJAX 验证
【发布时间】:2025-12-13 12:20:06
【问题描述】:

最近我正在尝试实现一个简单的 Django 应用程序,其中包括一个服务器端 AJAX 验证,它是一个简单的表单输入字段(用户名)。我使用了一个使用 jQuery 的预建行 AJAX 验证库。所以代码是这样的

HTML sn-p

<form id="simpleform" method="post" action="/done/">

Username:<input value="" class="validate[required,custom[noSpecialCaracters],length[0,20],ajax[ajaxUser]]" type="text" name="user" id="user" />

<input class="submit" type="submit" value="Validate"/>
</form>

服务器端代码 sn-p(嵌入到 php 脚本中)

/* RECEIVE VALUE */
$validateValue=$_POST['validateValue'];
$validateId=$_POST['validateId'];
$validateError=$_POST['validateError'];

    /* RETURN VALUE */
    $arrayToJs = array();
    $arrayToJs[0] = $validateId;
    $arrayToJs[1] = $validateError;

if($validateValue =="testname"){        // validate??
    $arrayToJs[2] = "true";         // RETURN TRUE
    echo '{"jsonValidateReturn":'.json_encode($arrayToJs).'}';          // RETURN ARRAY WITH success
}else{
    for($x=0;$x<1000000;$x++){
        if($x == 990000){
            $arrayToJs[2] = "false";
            echo '{"jsonValidateReturn":'.json_encode($arrayToJs).'}';      // RETURN ARRAY WITH ERROR
        }
    }

}

所以我的问题是我如何将它放入 Python 代码中(以便在 Django 环境中使用)如何将用户名从输入字段中获取到后端,我认为服务器端脚本 sn -p 已经做到了,但我想知道如何在我的 Pyhon 代码中使用它,这是我第一次使用 jQuery,我确实需要使用这个完全相同的验证库。需要贵公司。

谢谢。

【问题讨论】:

    标签: ajax django


    【解决方案1】:

    首先,您的 HTML sn-p 一点也不好。只是你不能给class 一个validate[required,custom[noSpecialCaracters],length[0,20],ajax[ajaxUser]] 的值,因为这违反了w3c 标准。

    其次,您不能只使用完全相同的验证系统,因为这里是 Django 和 Python,这意味着完全不同的系统具有比您提供的纯 php 更好的验证过程。所以我建议你,想一种不同的方式来做你想做的事,尤其是你在class(!)中分配的长值,这似乎不是一个有效的css类。我建议您改用 hidden 字段。

    虽然这里是你的起点:

    HTML 模板,index.html

    {% if form.errors %}
        <div class="alert alert-error">
            {{ form.errors }}
        </div>
    {% endif %}
    <form id="simpleform" method="post" action="/done/">
        <label for="{{ form.username.name }}">{{ form.username.label }}</label>
        {{ form.username }}
        {% csrf_token %}
        <button id="submit" class="submit" type="submit">Validate</button>
    </form>
    

    forms.py。只需在您的应用文件夹中创建此文件

    from django import forms
    class SimpleForm(forms.Form):
        username = forms.CharField(label="Username:", max_length=30, widget=forms.TextInput(attrs={'id':'username', 'class':'css-class-name', 'data-validation':'validate[required,custom[noSpecialCaracters],length[0,20],ajax[ajaxUser]]'}))
    

    views.py

    from django.shortcuts import render
    from django.http import HttpResponse
    from django.utils import simplejson
    from django.views.decorators.csrf import csrf_exempt
    from .forms import SimpleForm
    
    @csrf_exempt
    def validate(request):
        if request.is_ajax():
            form = SimpleForm(request.POST)
            if form.is_valid():
                #Do something when the form is valid...
    
                response_data = { 'username':form.cleaned_data['username'] }
                return HttpResponse(simplejson.dumps(response_data), mimetype="application/json")
        else:
            form = SimpleForm()
    
        template = {
            'form':form
            }
    
        return render(request, 'index.html', template)
    

    您的 urls.py 应该如下所示。是 views.py 所在文件夹的名称。

    from django.conf.urls.defaults import patterns, url
    urlpatterns = patterns('',
        url(r'^done/$', 'appname.views.validate', name='validate'),
    )
    

    在您的 JQuery 代码中,您应该使用 JQuery 的 data 方法处理 data-validation 属性。

    要处理 AJAX,请检查 JQuery 的 .ajax 方法。一个简短的例子是这样的:

    $.ajax({
        type: 'POST',
        url: '/done/',
        data: {username: get_username_here},
        dataType: 'json',
        beforeSend: function(jqXHR, settings) {
            //Do something before send...
        },
        success: function(data, textStatus, jqXHR) {
            alert('Ajax success: ' + data.username);
        },
        error: function(jqXHR, textStatus, errorThrown) {
            alert(textStatus + '. ' + errorThrown);
        }
    });
    

    【讨论】:

      【解决方案2】:

      看看at the docs

      【讨论】:

      • 谢谢,但我之前看过,没有找到我需要的。
      • 然后再看看我的链接后面。这正是您正在寻找的......
      【解决方案3】:

      你就像你做的那样,django 视图接收一个请求参数。请求参数有一个 POST “字典”。

      def validate(request):
          print request.POST["validateValue"]
          ...
      

      【讨论】:

      • 是的,我们可以获取请求参数,但在这种情况下它不是请求参数,我正在寻找一种可以将服务器端脚本(javascript)嵌入到我的视图中的解决方案,这样我就可以轻松将 json 值返回给客户端。
      【解决方案4】:

      这有点离题,但根据我的经验,最好以与提交时的常规表单验证完全相同的方式进行服务器端 AJAX 验证——如果有的话,通过使用完全相同的验证代码,这会给出完全相同的错误消息- 因此提供一致的Hijax-compliant 用户体验。

      【讨论】: