经过大量的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 - ...”
最佳做法是什么?
非常感谢你的帮助。
答案 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);
}
});