Найти - Пользователи
Полная версия: Дополнительная валидация в методе контролера
Начало » Pyramid / Pylons / TurboGears » Дополнительная валидация в методе контролера
1
PooH
Помогите, плиз, совсем туплю.

Вот валидаторы обрабатывают ввод. А как мне отобразить ошибки, которые происходят уже в контролере?
Например произошло исключение в базе данных - номер существует, хочется так-же его подсветить контрол с номером на форме.
pythonwin
PooH ты хочешь сделать это через декораторы?
попробуй:
http://docs.turbogears.org/1.0/ErrorHandling?action=show&redirect=1.0%2FExceptionHandling
http://docs.turbogears.org/1.0/ErrorHandling

или можно свой написать декоратор
OlDer
PooH
А как мне отобразить ошибки, которые происходят уже в контролере?
Я перехватываю исключение сам, и для сообщения использую flash():
from turbogears import flash, url

expose()
def mymethod(self):
try:
raise Exception, “Shit happens!”
except:
flash(“WTF?”)
raise redirect(url(“/”))
Только нужно в template предусмотреть где-нибудь для него место:
<div id=“flash” class=“flash” py:content=“tg_flash”></div>
и в css красивым красным цветом раскрасить класс flash ;-)
Хотя, по правильному, надо бы использовать @exception_handler
Maximbo
В Django это делается так: один метод в контролёре обрабатывает и отображение формы и её обработку, разделяя их по типу запроса (GET/POST).

Например так:

methodname():
if request.POST:
# запрос POST, обработка данных из формы
....
if errors: # ошибка в данных
# показать форму, передав в неё переменную errors (tg_errors в TurboGears)
else:
# показать результат
else:
# запрос GET, данных формы нет, отображаем её
В TG, наверное, можно сделать так же.
При этом в шаблоне написать что-то вроде:

< input type="text" name="address" />
< label py:if="tg_errors['address'] for="address">Ошибка в поле адреса< /label>
OlDer
Maximbo
В Django это делается так
Т.е. в Django вообще нет валидаторов и все делается вручную?
Maximbo
OlDer
Т.е. в Django вообще нет валидаторов и все делается вручную?
Валидаторы в Django есть, и они очень мощные. Правда не через декораторы. Но к данному топику это не относится ;)
PooH
Не знаю, насколько правильно, но пока решил так:
import turbogears.util as tg_util
from turbogears import errorhandling
import cherrypy
    
def showErrors(method, errors, *args, **kw):    
    cherrypy.request.validation_errors = errors
    args, kw = tg_util.from_kw(method, args, kw)
    return errorhandling.run_with_errors(errors, method, *args, **kw)
в методе контролера
    @expose()
    @validate(form=parcelForm)
    @error_handler(edit)
    def save(self, id=None, *args, **kw):  
        errors = {}
#------ skip ----------     
        try:        
            obj.setAllowUse(useForm,date)
        except model.InvalidDateError:            
                errors['useForm'] = u"На указаную дату значение существует"
#------ skip ----------     
        if errors:
            return showErrors(self.edit, errors, args, kw)
        else:
            flash(u'Данные сохранены')        
            raise redirect("/parcel/edit?id=%s" % obj.id) 
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB