Django - Ajax registration

2019-03-22 02:42发布

问题:

I am trying to allow registration (using this django-registration register view) to one of my applications from a modal dialog.

Since this form is in a modal box, I'd like to get an json reponse on success (instead of the default redirection)

How can I use this view (django-registration register) to manage the registration and send back a json response on success ?


I know how to make ajax/json responses, the question is how to use the django-registration view without the redirection behavior or wrap it into an other view to manage the response.

回答1:

First you need to change the urls.py to wrap the existing view with another functionality. To do that you have to create a new backend package in backends folder and change urls.py there while keeping everything else intact, or you could just go ahead and modify the existing urls.py in the backend package.

I have not tested this, but it should work.

Point url to the new view:

# urls.py
url(r'^register/$', register_wrap,
    {'backend': 'registration.backends.default.DefaultBackend'},
    name='registration_register'),

# your new view that wraps the existing one
def register_wrap(request, *args, **kwargs):

    # call the standard view here
    response = register(request, *args, **kwargs)

    # check if response is a redirect
    if response.status_code == 302:
        # this was redirection, send json response instead
    else:
        # just return as it is
        return response

If you are going to need this for more views you can just create a decorator using this.



回答2:

Why I would do is to check if request.is_ajax() in your normal after-successfull-registration-redirect view and return json response there.



回答3:

You ask how you can use the existing view to manage the registration and send back a json response on success. Since the HttpResponseRedirect is pretty much hard coded in the view, you can't use the view as it is. Instead, either fork it, or write your own view and change the urls.py so that r'^register/$' directs to your new view.

As far as the json response is concerned, on success you can do something like this:

from django.utils import simplejson as json

def register_ajax(request):
    ...
    return HttpResponse(json.dumps(dict(success=True, **dict_containing_data)))

Hope this helps