检查AJAX中是否存在用户名

时间:2015-01-15 08:40:01

标签: jquery ajax django django-forms

经过大量的PHP工作后,我开始使用Django。 我习惯了使用PHP的AJAX,它运行良好。但是我现在在Django做程序化PHP,我有点迷失。

我的第一个AJAX用例非常简单。我正在使用表单进行注册页面,如果用户填写的用户名可用,我想检查AJAX。 我是用Python做的,但现在,我想用AJAX做,但我真的不知道怎么做。虽然是网络,我发现了几个教程,但没有一个与其他教程相同,而且我不知道如何对我自己的代码进行操作。

如果你可以指导我,那就太好了。

views.py:

from django.shortcuts import render
from django.template.defaultfilters import slugify
from django.contrib.auth.models import User
from membres.models import UserProfile, UserProfilePublic, UserProfilePrivate
from membres.forms import RegisterForm

def register(request):
    if request.method == 'POST':
        if request.is_ajax():
            if User.objects.filter(username=username).exists():
                return "exists"

        form = RegisterForm(request.POST)

        if form.is_valid():
            username = form.cleaned_data['username'].strip()
            email = form.cleaned_data['email']
            password = form.cleaned_data['password']
            slug = slugify(username)

            user = User.objects.create_user(username, email, password)
            profile = UserProfile(user= user, slug= slug)
            profile.save()
            profile_public = UserProfilePublic(user= user)
            profile_public.save()
            profile_private = UserProfilePrivate(user= user)
            profile_private.save()

            form_validated = True

    else:
        form = RegisterForm()

    return render(request, 'membres/register.html', locals())

forms.py:

from django import forms
from django.contrib.auth.models import User

class RegisterForm(forms.Form):
    username = forms.CharField(min_length=5, max_length=30, required=True)
    email = forms.EmailField(max_length=75, required=True)
    password = forms.CharField(widget=forms.PasswordInput, required=True)
    password_check = forms.CharField(widget=forms.PasswordInput, required=True)

    def clean(self):
        cleaned_data = super(RegisterForm, self).clean()
        username = cleaned_data.get('username')
        email = cleaned_data.get('email')
        password = cleaned_data.get('password')
        password_check = cleaned_data.get('password_check')

        # Username
        if User.objects.filter(username=username).exists():
            msg = "Cet utilisateur existe déjà"
            self.add_error('username', msg)

        # Password
        if password_check != password:
            msg = "Le mot de passe et sa confirmation doivent être identiques"
            self.add_error('password_check', msg)

        return cleaned_data

register.html模板:

blur: function(){
        var value = $(this).val();
        var length = value.length;
        var id = $(this).attr('id');
        var label = $("label[for='"+id+"']");
        if($(this).parent().hasClass("field-mandatory")) {
            if(!value) {
                $("label[for='"+id+"']").append(checkStartInvalid + "Ne peut être vide" + checkEnd);
            } else {
                if(id == 'id_username') {
                    if(length < 5 || length > 30) {
                        label.append(checkStartInvalid + "Nombre de caractères compris entre 5 et 30" + checkEnd);
                    } else {
                        $.ajax({
                            url: '',
                            data: 'username='+value,
                            type: 'POST',
                            success: function(data){
                                console.log(data);
                            }
                        });
                        label.append(checkValid);
                    }
                }

正如您在views.py中看到的那样,我尝试过,但是在控制台中出现错误:“NetworkError:403 FORBIDDEN - ...”

最佳做法是什么?

非常感谢你的帮助。

2 个答案:

答案 0 :(得分:1)

您应该在请求中包含CSRF令牌(或使用csrf_exempt修饰您的register方法 - 我不建议这样做。)

看看这个例子 https://docs.djangoproject.com/en/dev/ref/csrf/#ajax


正如Daniel Roseman在评论中提到的那样,您应该将GET方法用于您的目的。从HTTP方法的语义角度来看,这是正确的。 阅读更多Here

答案 1 :(得分:0)

这应该有效

  $.ajax({
     csrfmiddlewaretoken: document.getElementsByName('csrfmiddlewaretoken')[0].value,

                        url: '',
                        data: 'username='+value,
                        type: 'POST',
                        success: function(data){
                            console.log(data);
                        }
                    });