在我的django应用程序中,我有一个表单,我要求用户输入电子邮件地址和用户名。
我希望能够检查用户名或电子邮件地址是否已存在引发错误。但我想在不重新加载页面的情况下这样做,所以使用javascript或Jquery。
我的第一个想法是这样的(用户名):
HTML:
<form method="post" onsubmit="return validateForm();">
{% csrf_token %}
<div id='error_message'></div>
<input class='username' type="text" name="username" value=""/>
<button type="submit">Valider</button>
</form>
在我的views.py中:
def myview(request):
users = User.objects.all()
return render_to_response('mytemplate.html', 'users':users, context_instance=RequestContext(request))
然后在我的模板中:
<div class='search'>
{% for user in users %}
<input type='hidden' value='{{user.username}}'
{% endfor %}
</div>
然后,在js:
function validateForm() {
var value = $('.username').val()
if( // find 'value' in all the <input type='hidden'> ) {
var error = 'Username already exists';
$("#error_message").html(error);
return false;
}
};
我认为这很复杂。有没有更简单的方法来实现这一目标?
感谢您的帮助。
答案 0 :(得分:5)
很抱歉,但就安全性和效率而言,您的方法非常糟糕。您正在披露用户的所有用户名(无论是否隐藏输入)。您应该检查一些已构建的身份验证应用,例如django-usernea django-allauth
我会选择ajax验证:
首先给你的表单一个id,例如my_form
<script>
$('#my_form').submit(function(){
var username = $('#username').val();
if (username == ''){
alert('please enter username');
return false;
}
$.ajax({
type: "POST",
url: "{% url auth_validate %}",
data: {'username': $('#username').val(), 'csrfmiddlewaretoken': '{{csrf_token}}'},
dataType: "text",
success: function(response) {
var response = $.parseJSON( response );
if (response.success){
return true;
}
else{
alert(response.error);
}
},
error: function(rs, e) {
alert(rs.responseText);
}
});
})
</script>
在urls.py
添加auth_validate
网址:
url(r'^auth_validate/$', 'myapp.views.auth_validate', name='auth_validate'),
现在在myapp.views
:
from django.http import HttpResponse
from django.utils import simplejson
from django.utils.translation import ugettext_lazy as _
def auth_validate(request):
error = ''
success = False
if request.method == 'POST':
username = request.POST.get('username', None)
if not username:
error = _('Please enter username')
elif User.objects.filter(username__exact=username).exists():
error = _('Sorry this username is already taken')
else:
success = True
ajax_vars = {'success': success, 'error': error}
return HttpResponse(simplejson.dumps(ajax_vars),
mimetype='application/javascript')