37. SQLALCHEMY + URL DISPATCH WIKI TUTORIAL
The matchdict will have a ’pagename’ key that matches the name of the page we’d like to add. If our add view is invoked via, e.g. http://localhost:6543/add_page/SomeName, the value for
’pagename’ in the matchdict will be ’SomeName’.
If the view execution is not a result of a form submission (i.e. the expression ’form.submitted’ in request.params is False), the view callable renders a template. To do so, it generates a “save url” which the template uses as the form post URL during rendering. We’re lazy here, so we’re going to use the same template (templates/edit.pt) for the add view as well as the page edit view. To do so we create a dummy Page object in order to satisfy the edit form’s desire to have some page object exposed as page. Pyramid will render the template associated with this view to a response.
If the view execution is a result of a form submission (i.e. the expression ’form.submitted’ in request.params is True), we scrape the page body from the form data, create a Page object with this page body and the name taken from matchdict[’pagename’], and save it into the database using DBSession.add. We then redirect back to the view_page view for the newly created page.
The edit_page view function
edit_page() is invoked when a user clicks the “Edit this Page” button on the view form. It renders an edit form but it also acts as the handler for the form it renders. The matchdict attribute of the request passed to the edit_page view will have a ’pagename’ key matching the name of the page the user wants to edit.
1 @view_config(route_name=’edit_page’, renderer=’templates/edit.pt’) 2 def edit_page(request):
3name = request.matchdict[’pagename’]
4 page = DBSession.query(Page).filter_by(name=name).one() 5 if ’form.submitted’ in request.params:
6page.data = request.params[’body’]
7DBSession.add(page)
8return HTTPFound(location = request.route_url(’view_page’,
10return dict(
11page=page,
12save_url = request.route_url(’edit_page’, pagename=name),
13)
If the view execution is not a result of a form submission (i.e. the expression ’form.submitted’ in request.params is False), the view simply renders the edit form, passing the page object and a save_url which will be used as the action of the generated form.
If the view execution is a result of a form submission (i.e. the expression ’form.submitted’ in request.params is True), the view grabs the body element of the request parameters and sets it as the data attribute of the page object. It then redirects to the view_page view of the wiki page.