On Jul 28, 5:04 am, Mike Orr <[email protected]> wrote: > On Wed, Jul 27, 2011 at 1:02 PM, Eduardo Miguez > > <[email protected]> wrote: > > Hi guys, I'm new to this Pyramid world (as a matter of fact I'm new to > > web development world) so I have a "best practice" question: > > Let's say I have this "users" model where I can store and retrieve > > user information such as name, social security id, address and the > > likes. > > If I want somebody to edit some of this information for a particular > > user I have to query the database and present the information through > > a view. If somebody updates some of that information it seems i have > > to create another view to receive the data, get the updated user id > > from the request, query the db again to populate an ORM object where > > to apply the changes submitted and update the instance. Looks to me > > that for every action I need to write two views and perform the same > > query twice (I would imagine that I could send the user instance in > > the view but I don't know how). Is that right? > > There's a natural sequence in form processing, which you'll get > familiar with if you practice with the form tutorials. The sequence is > forced by the stateless and string-based nature of HTTP and HTML, so > you can't avoid it except by making a client-side > (Javascript/Flash/Java) application. > > In the first request, the user GETs the page containing the form. It's > easiest to encode the record ID in the URL: /records/1234/edit . That > way it's separate from the POST and GET variables. You fetch the model > object (ORMClass.get(1234)) and plug the current values into the form. > Or if it's a new record you set the form fields to their blank/default > values. I like to use the same template for both adding and updating, > so I include a boolean flag 'is_adding' in my template variables. > > The user fills out the form and POSTs it back to you. You can have it > post back to the same view or a different view, as you wish. The > Pylons default was to post it to a different view, but many Pyramid > users post to the same view. The latter is simpler in my opinion. So > you'd structure the view as Malthe suggested: > > id_ = self.request.matchdict["id"] > obj = model.ORMClass.get(id) > abort 400 if ID is invalid, or 404 if the object does not exist > if self.request.method == "POST": > validate input > if input is valid: > update object and commit > optionally set a flash message using > session.flash("successfully updated record") > redirect to the record's display page > else: > # input is not valid > set error messages in form > set form variables to user input > else: > # The user has not seen the form yet, or is reloading the form page > set form variables to the object's current state > render form > > So the object is fetched twice, but in two different requests. You > can't share an object instance between requests, at least not without > fancy caching or storing it in the session, but those add too much > complexity. There's little overhead in fetching a single record by > its primary key, and the overhead is worth it if it's important to > modify this record. > > You can't send an object to the browser. Even if you could, you'd have > to validate the entire object when you get it back because the user > could have done anything to it, including returning a broken or hacked > or fake object. The only exception is if you're writing a client-side > application (Javascript, Flash, or Java); then it could make an AJAX > request for a JSON representation of the object, and submit the > updates via JSON. But in that case your server-side application would > be a web service, and you wouldn't be sending forms from the server > (probably). >
Malthe/Mike, thanks a lot for taking the time to answer my questions. I really appreciate it. -- You received this message because you are subscribed to the Google Groups "pylons-discuss" group. To post to this group, send email to [email protected]. To unsubscribe from this group, send email to [email protected]. For more options, visit this group at http://groups.google.com/group/pylons-discuss?hl=en.
