简体   繁体   中英

Django POST not calling view

I am trying to create a simple subscription form in the front page of my site. I created the view with a model form (the model contains only name and e-mail as attributes). When I go to the root address (GET) it works fine and loads the form. I then fill it with some data, click the submit button (the form action can either be set to '' or '/', the result is the same) and it redirects to the same root page, but it does not load anything, the page remains blank. In the console I can see it calling through POST method, but not even the first print of the view function gets printed.

Any ideas? I know it must be something silly, but I spent sometime in it and haven't yet found out what it could be.

In urls.py:

url(r'', FrontPage.as_view(template_name='rootsite/frontpage.html')),

In rootsite/views.py

class FrontPage(TemplateView):
    '''
    Front (index) page of the app, so that users can subscribe to
    have create their own instance of the app
    '''

    template_name = 'rootsite/frontpage.html'

    def get_context_data(self, 
                         *args, 
                         **kwargs):

        c = {}
        c.update(csrf(self.request))
        print self.request.method
        if self.request.method is 'POST':
            print 'OK - POST IT IS, FINALLY'
            form = NewUsersForm(self.request.POST)
            print form.__dict__
            if form.is_valid():
                form.save()
                return HttpResponseRedirect('/' + '?thanks=1')
         else:
            form = NewUsersForm()

        return {'form':form}

You can't return a redirect from within get_context_data - it's for context data only, hence the name.

You should really be using a proper form view for this, which includes methods for redirecting after form validation.

Did you include a csrf_token in your template (as per the example here: http://www.djangobook.com/en/2.0/chapter07.html )?

<form action="" method="post">
    <table>
        {{ form.as_table }}
    </table>
    {% csrf_token %}
    <input type="submit" value="Submit">
</form>

I could be wrong, but I thought Django wouldn't accept a POST request without a csrf token?

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM