2013-07-04 1 views
1

У меня есть z3c.form, где некоторые ошибки не могут быть известны до того, как действие формы будет выполнено. Я бы хотел показать эти ошибки в полях, а не в сообщении о состоянии глобальной формы. Как любой может конструировать и вводить ошибку виджетам в Form.update()?Ошибки в инъекционном поле в обработчике формы z3c.form

Пример:

@z3c.form.button.buttonAndHandler(_('Make Report'), name='report') 
def report(self, action): 

    data, errors = self.extractData() 

    if errors: 
     self.status = "Please correct errors" 
     return 

    # Create sample item which we can consume in the page template 
    try: 
     self.output = make_report(self.context, self.request, data, filters=filters) 
    except zope.interface.Invalid as e: 
     self.status = e.message 
     self.errors = True 
     # How to target the error message to a particular field here 
     return 

    self.status = _(u"Report complete") 

ответ

1

В formlib я решил эту задачу с помощью метода set_invariant_error вы можете найти в этой форме: - https://github.com/PloneGov-IT/rg.prenotazioni/blob/master/rg/prenotazioni/browser/prenotazione_add.py#L312

Я думаю, что это многоразовое с небольшой болью для z3c.form

+0

Это в основном делает то же самое, что и мой код, но жестко кодирует 'WidgetInputError()' вместо поиска адаптера. Скорее всего, это хорошо. –

1

В рамках действия формы вы можете создать WidgetActionExecutionError, передав имя поля и исключение Invalid с сообщением, которое вы хотите отобразить. Затем z3c.form позаботится о прикреплении ошибки к правильному виджету и ее рендеринга, чтобы вам не пришлось делать все шаги самостоятельно.

Для вашего кода это будет выглядеть так:

from z3c.form.interfaces import WidgetActionExecutionError 

@z3c.form.button.buttonAndHandler(_('Make Report'), name='report') 
def report(self, action): 

    data, errors = self.extractData() 

    if errors: 
     self.status = "Please correct errors" 
     return 

    # Create sample item which we can consume in the page template 
    try: 
     self.output = make_report(self.context, self.request, data, filters=filters) 
    except zope.interface.Invalid as e: 
     raise WidgetActionExecutionError('target_field_name', e) 

    self.status = _(u"Report complete") 

См http://developer.plone.org/reference_manuals/active/schema-driven-forms/customising-form-behaviour/validation.html#validating-in-action-handlers другой пример.

+0

Интересно; Должно быть, я был слишком близок к коду, чтобы увидеть обработчик исключений. –