2011-06-26 26 views
4

我想动态更新基于HTTP获取变量中包含的变量的表单字段。特别是www.site.com/form?id=name。我想从URL中拉出'id'字段并自动填充表单的memberID字段。如何修改updateWidgets中的z3c表单字段?

我可以使用self.request.get('id')访问get变量。但是我一直无法弄清楚如何更新表单域。我检查了小部件文档http://packages.python.org/z3c.form/widget.html,但没有任何建议起作用。

class IUpdateEmailFormSchema(interface.Interface): 
    # -*- extra stuff goes here -*- 
    """ 
    """ 
    memberID = schema.TextLine(title=(u'Member id')) 

    email = schema.TextLine(title=(u'Email'), description=(u'The email')) 

class updateEmailForm(form.Form): 
    fields = field.Fields(IUpdateEmailFormSchema) 
    label = _(u'Change Email') 
    ignoreContext = True 


    @button.buttonAndHandler(u'Update') 
    def handleUpdate(self,action): 
     data, errors = self.extractData() 

     if data.has_key('email'): 

      portal_membership = getToolByName(self.context, 'portal_membership') 
      member = portal_membership.getMemberById(data['memberID']) 

    def updateWidgets(self): 
     print "This is update widget \n\n" 
     import pdb; pdb.set_trace() 
     print self.request.form['id'] #Does not work as specified in http://packages.python.org/z3c.form/widget.html 
     #self.widgets["memberID"].value = self.request.get('id').encode('utf-8') 
     form.Form.updateWidgets(self) 

updateEmailFormView = wrap_form(updateEmailForm) 

*更新:updateWidget未正确缩进。

回答

5

updateWidgets方法是正确的做法。 只是你shouuld第一个电话“form.Form.updateWidgets”,然后做你的 变化(甚至更好的用户超()的波纹管所示):

def updateWidgets(self): 
    super(updateEmailForm, self).updateWidgets() 
    id = self.request.get('id', None) 
    if id: 
     self.widgets["memberID"].value = id.encode('utf-8') 

所以基本上是错误的顺序

和如果没有要求(这是有点奇怪,你很可能做一些拨错在那里),那么你可以得到它via

from zope.globalrequest import getRequest 
request = getRequest() 
+0

非常感谢Rok。我实施了你的建议并取得了一些进展。现在,表单字段memberID的值实际上会使用正确的ID进行更新,但是当页面呈现时,它不会使用ID填充。我使用pdb确认该值实际上已正确更改,但使用ID时文本字段不会更改。我错过了什么吗? –

3

您的updateWigets()将不会在上面调用,因为它不在窗体的正文内,它是顶级函数。另外,你应该使用super()来调用父版本的updateWidgets() - 在你的情况下,你可能想先调用父版本,然后改变值或其他。

您最好使用默认值适配器而不是updateWidgets()。

+0

问候optilute。感谢您的建议。但有几点。我编辑了原始代码。出于某种原因,当我复制它时,updateWidget没有正确缩进。 2. updateWidgets函数实际上运行。我在终端上用打印线测试过它。此外,Plone文档(http://collective-docs.plone.org/forms/z3c.form.html#modifying-a-widget)建议将更新函数放在这个地方。所以我不确定你是否遇到过别的。 2.即使我调用了父函数,我用来修改该字段的访问器是什么? 3.你能否... –

+0

我不明白默认值的建议。 self.request未在表单模式定义的范围内定义。我将如何访问它? –

相关问题