The "registration 1.0" app hasn't really been created to support ajax in the first place, so you have a lot of overriding to do.
Just to make the registration working you need something like this:
import json
from django.http import HttpResponse
from django.views.generic.edit import CreateView
from django.contrib.auth.models import User
from registration.views import RegistrationView
class AjaxableResponseMixin(object):
def get_form_kwargs(self):
kwargs = {'initial': self.get_initial()}
if self.request.method in ('POST', 'PUT'):
dict_ = self.request.POST.copy()
del dict_['csrfmiddlewaretoken']
kwargs.update({
'data': dict_,
'files': self.request.FILES,
})
return kwargs
def render_to_json_response(self, context, **response_kwargs):
data = json.dumps(context)
response_kwargs['content_type'] = 'application/json'
return HttpResponse(data, **response_kwargs)
def form_invalid(self, form):
response = super(AjaxableResponseMixin, self).form_invalid(form)
if self.request.is_ajax():
return self.render_to_json_response(form.errors, status=400)
else:
return response
def form_valid(self, request, form):
if self.request.is_ajax():
new_user = self.register(request, **form.cleaned_data)
data = {
'pk': new_user.pk,
}
return self.render_to_json_response(data)
else:
response = super(AjaxableResponseMixin, self).form_valid(request, form)
return response
class MyRegistrationView(AjaxableResponseMixin, RegistrationView):
def register(self, request, **cleaned_data):
del cleaned_data['password2']
user = User.objects.create_user(data['username'], data['email'], data['password1'])
return user
urls.py
(r'^accounts/register/', MyRegistrationView.as_view()),
(r'^accounts/', include('registration.backends.default.urls')),
html
<!DOCTYPE html>
<html>
<head>
<title></title>
<script src="http://code.jquery.com/jquery-1.10.1.min.js"></script>
</head>
<body>
<form id="registration" action="." method="post">{% csrf_token %}
{{ form }}
<input type="submit" name="submit" value="Submit" />
</form>
<script type="text/javascript">
$('#registration').submit(function(e){
e.preventDefault();
$.ajax({
url: '/accounts/register/',
type: 'POST',
dataType: "json",
beforeSend: function (request) {
request.setRequestHeader("X-CSRFToken", $('input[name="csrfmiddlewaretoken"]').val());
},
data: $('#registration').serialize(),
success: function() {
console.log('success');
},
error: function(errorThrown){
console.log(errorThrown);
}
});
});
</script>
</body>
</html>