[Zope3-Users] Re: redirects in a formlib EditForm

Joel Moxley jfmoxley at gmail.com
Mon Feb 27 22:52:19 EST 2006


Yahtzee!

On 2/27/06, Gary Poster <gary at zope.com> wrote:

> > Damn, I still can't get this working right after following all of the
> > instructions here.  I can successfully stash the refering url in a
> > hidden form, but it's not showing up in my request.
>
> I can think of two possible things.
>
> One is that you are maybe getting a form validation error and then
> pressing Apply, or that you are using a widget that redraws the screen.
>
> Another is that we might have a bug that makes form variables be
> stomped on by header names. :-(

Gary is a very smart.

> def referer(self):
>      return self.request.form.get('HTTP_REFERER') or
> self.request.getHeader('HTTP_REFERER')

This does not work... same behaviour as previous.

> Then if that doesn't work, try changing it to
>
> def referer(self):
>      return self.request.form.get('referrer') or
> self.request.getHeader('HTTP_REFERER')
>
> and changing your template to have
> >    <input type="hidden" name="referrer" value=""
> >         tal:attributes="value view/referer" />
>
> (Sadly, the spec made a spelling error with "referer". :-) )

Yahtzee!  This works great.  So I guess form names are being stomped
by header names.

Thank you so much, Gary.  Let me know if I should do anything to
follow up on this bug.

For posterity, here's my setup.

from zope.formlib import form
from zope.app.pagetemplate import ViewPageTemplateFile

class PitcherEditForm(form.EditForm):
    form_fields = form.Fields(interfaces.IPitcher).select('Last',
'First', 'ERA')

    base_template = form.EditForm.template
    template = ViewPageTemplateFile('editTemplate.pt')

    def referer(self):
        return self.request.form.get('referrer') or
self.request.getHeader('HTTP_REFERER')

    def render(self):
        if self.errors is None or self.errors:
            return super(PitcherEditForm, self).render()
        # DO NOT USE HTTP_REFERER AS A FORM NAME
        #redirectTo=self.request.form.get('HTTP_REFERER', '..')
        redirectTo=self.request.form.get('referrer', '..')
        self.request.response.redirect(redirectTo)

<editTemplate.pt>

<div metal:use-macro="view/base_template/macros/main" >
  <div metal:fill-slot="extra_info">
   <input type="hidden" name="referrer" value=""
        tal:attributes="value view/referer" />
  </div>
</div>


More information about the Zope3-users mailing list