如何在updateWidgets中修改z3c表单字段?

时间:2011-06-26 09:43:24

标签: forms plone zope z3c.form

我正在尝试根据HTTP get变量中包含的变量动态更新表单字段。特别是www.site.com/form?id=name。我想从url中提取'id'字段并自动填充表单的memberID字段。

我可以使用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未正确缩进。

2 个答案:

答案 0 :(得分:5)

updateWidgets方法是正确的做法。 只是你shouuld第一次调用“form.Form.updateWidgets”,然后做你的 更改(更好的用户super()如下所示):

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()

答案 1 :(得分:3)

您的updateWigets()不会在上面调用,因为它不在表单的正文中,它是顶级函数。

此外,您应该使用super()来调用updateWidgets()的父版本 - 在您的情况下,您可能希望先调用父版本,然后更改值或其他。

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