Ken Winter wrote:
-----Original Message-----
From: J Cameron Cooper [mailto:[EMAIL PROTECTED]
Sent: Wednesday, May 11, 2005 4:27 PM
To: [EMAIL PROTECTED]
Cc: zope@zope.org
Subject: Re: [Zope] How to make a ZPT-based form that calls itself?

Ken Winter wrote:

Hi Zopers -

I'm trying to make a ZPT-based HTML form that:

1. Displays the records in a MySQL 'Person' table;
2. Offers a field for updating this table (in my simple test example, it
accepts the Id of a Person to delete);
3. When you push its 'Submit' button, updates the database; and then
4. Automatically redisplays itself, showing the updated 'Person'

records.

After a lot of help from the folks on various Zope lists, I've made it
through steps 1-3, but I'm stuck on step 4 and I can't find an example

or

tutorial telling me how to do it.

The relevant code snippets are:

The ZPT's body...

...

...The one-line Python script "delete_person_py" that the form's action attribute calls...

container.delete_person(person_id=context.REQUEST.get('person_id'))

...The Z SQL method delete_person(person_id) that the Python script

calls...

delete from person where <dtml-sqltest person_id op=eq type=int>

...And a URL to the test page in its current incarnation...

http://dhat.vega.zettai.net/clients/ridhwan/dhr3/deltest.htm

What's wrong with this page is that you have to hit the "Refresh This

Page"

link to get it to do what I want it to do automatically.

I suspect that what I'm missing is some basic HTML knowledge. But

whatever

it is, I'd appreciate your help in suggesting the missing piece.

You submit to a script, going that url, and the script is responsible for providing the output of the page.

Since you write no output, you see no action in your browser. Some
browsers may display a blank page, which probably would have been more
helpful to you.

You want your script to do something. It might print out some text to
form HTML, but that's nasty. It usually will either (a) call some other
object, like a page template, to provide output, or (b) do a redirect.

Case A:
  return context.some_page()

Case B:
  context.REQUEST.RESPONSE.redirect('some_page')


GREAT!! Case B works perfectly (and it would have taken me forever to guess
this solution). Case A didn't work when written as


return context.deltest.htm()

but, who cares?

Look at your Python. It understands a dot as an attribute access. That's why Zope historically avoids dotted object names. Witness 'index_html'.


You may use dictionary lookup:

 context['deltest.htm']()

or getattr.

In your case, since this is a destructive method, you probably want do a
redirect, back to your listing.

"Destructive" means that the script has a side-effect (deleting the Person),
right?

Correct.

Why in that case is a redirect better?

Because you don't end up on the script (no bad bookmark), and reload of that page won't carry the previous POST payload. See the very recent post about redirect-after-post.


A more advanced and flexible technique is to use FormController. With
that, you specify by configuration if you want redirect or traverse and
where to go based on the results of the script (success, failure, some
other state.)

I'm looking into this - looks promising at first glance. I note that the Add dialog warns that "these are normally useful only inside a CMF site." Mine is not (at least currently) a CMF site. Should I worry about that?

A Plone site it a superset of a CMF site. But it you're outside a CMF framework entirely, formcontroller may not work, as it needs to install a tool. Dunno if it'll install standalone.


                --jcc

--
"Building Websites with Plone"
http://plonebook.packtpub.com/
_______________________________________________
Zope maillist - Zope@zope.org
http://mail.zope.org/mailman/listinfo/zope
** No cross posts or HTML encoding! **
(Related lists - http://mail.zope.org/mailman/listinfo/zope-announce
http://mail.zope.org/mailman/listinfo/zope-dev )

Reply via email to