Как изменить поле формы z3c в updateWidgets? - PullRequest
4 голосов
/ 26 июня 2011

Я пытаюсь динамически обновить поле формы на основе переменной, включенной в переменную HTTP get. В частности, www.site.com/form?id=name. Я хочу извлечь поле 'id' из URL и автоматически заполнить поле memberID формы.

У меня есть доступ к переменной get с помощью self.request.get ('id'). Однако я не смог выяснить, как обновить поле формы. Я изучил документацию виджета 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 ]

5 голосов
/ 27 июня 2011

Метод updateWidgets - правильное место, чтобы сделать это.просто вы сначала должны вызвать «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')

, поэтому в основном ошибка была порядка

и если нет запроса (что довольно странно, и вы, вероятно, там что-то делаете), вы можете получить его через :

from zope.globalrequest import getRequest
request = getRequest()
3 голосов
/ 26 июня 2011

Ваш updateWigets () не будет вызываться выше, потому что он не внутри тела формы, это функция верхнего уровня.

Кроме того, вы должны использовать super () для вызова родительской версии updateWidgets() - в вашем случае вы, вероятно, захотите сначала вызвать родительскую версию, а затем изменить значение или что-то еще.

Возможно, вам лучше использовать адаптер значения по умолчанию вместо updateWidgets ().

...