Уведомления

Группа в Telegram: @pythonsu

#1 Март 4, 2007 13:15:06

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

Дополнительная валидация в методе контролера

Помогите, плиз, совсем туплю.

Вот валидаторы обрабатывают ввод. А как мне отобразить ошибки, которые происходят уже в контролере?
Например произошло исключение в базе данных - номер существует, хочется так-же его подсветить контрол с номером на форме.



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

#2 Март 5, 2007 07:04:02

pythonwin
От:
Зарегистрирован: 2006-07-18
Сообщения: 1294
Репутация: +  0  -
Профиль   Отправить e-mail  

Дополнительная валидация в методе контролера

PooH ты хочешь сделать это через декораторы?
попробуй:
http://docs.turbogears.org/1.0/ErrorHandling?action=show&redirect=1.0%2FExceptionHandling
http://docs.turbogears.org/1.0/ErrorHandling

или можно свой написать декоратор



Офлайн

#3 Март 5, 2007 21:27:35

OlDer
От:
Зарегистрирован: 2006-07-19
Сообщения: 133
Репутация: +  0  -
Профиль   Отправить e-mail  

Дополнительная валидация в методе контролера

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



Отредактировано (Март 5, 2007 21:31:51)

Офлайн

#4 Март 6, 2007 09:45:22

Maximbo
От:
Зарегистрирован: 2006-11-04
Сообщения: 137
Репутация: +  0  -
Профиль   Отправить e-mail  

Дополнительная валидация в методе контролера

В 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>



Офлайн

#5 Март 6, 2007 15:50:32

OlDer
От:
Зарегистрирован: 2006-07-19
Сообщения: 133
Репутация: +  0  -
Профиль   Отправить e-mail  

Дополнительная валидация в методе контролера

Maximbo
В Django это делается так
Т.е. в Django вообще нет валидаторов и все делается вручную?



Офлайн

#6 Март 6, 2007 17:37:45

Maximbo
От:
Зарегистрирован: 2006-11-04
Сообщения: 137
Репутация: +  0  -
Профиль   Отправить e-mail  

Дополнительная валидация в методе контролера

OlDer
Т.е. в Django вообще нет валидаторов и все делается вручную?
Валидаторы в Django есть, и они очень мощные. Правда не через декораторы. Но к данному топику это не относится ;)



Офлайн

#7 Март 12, 2007 08:02:57

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

Дополнительная валидация в методе контролера

Не знаю, насколько правильно, но пока решил так:

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) 



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Отредактировано (Март 12, 2007 08:04:09)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version