Я следовал этому примеру, но немного изменил его, чтобы он подходил для моего проекта
Вот что у меня есть:
class AgentFormValidation(object):
def __init__(self, context, request):
self.context = context
self.request = request
def __call__(self, form, value):
number = value['identity_information']['number']
print validateID(number)
type = value['identity_information']['type']
q = sqlahelper.get_session().query(Agents.id_number).filter(Agents.id_number == number).first()
if type == "IDNumber":
if not validateID(number):
if q:
exc = colander.Invalid(form["identity_information"], "ID Number %s already exists in Database" % number)
exc.number = "ID Number already exists "
raise exc
else:
exc = colander.Invalid(form["identity_information"], "ID Number %s is not a valid SA ID Number" % number)
exc.number = "Invalid ID number"
raise exc
elif type == "Passport":
if q:
exc = colander.Invalid(form["identity_information"], "Passport number %s already exists in Database" % number)
exc.number = "Passport number already exists"
raise exc
def gen_agent_schema_form(self):
_but = ('create agent',)
_title = "Create Agent"
if not self.context.__is_new__:
_but = ('update agent',)
_title = "Agent Details"
deals = []
if self.context.ou:
deals = [(deal.id, str(deal)) for deal in self.context.ou[0].org_deals]
schema = Agent(validator=AgentFormValidation(self.context, self.request), title=_title).bind(deals=deals)
form = Form(schema, buttons=_but)
return schema, form
Проверка работает нормально. Он просто не хочет выделять элемент.
Когда я заменяю:
exc.number = "ID Number already exists"
с участием
exc['number'] = "ID Number already exists"
Он выделяет, но выделяет самый первый элемент формы, first_name
, что также неверно.
Я чувствую, что упускаю что-то маленькое.
ОБНОВЛЕНИЕ
Поэтому я немного поиграл, когда делаю:
exc = colander.Invalid(form, "ID Number %s already exists in Database" % number)
exc["identity_information"] = "ID Number already exists "
raise exc
Я получаю окно с предупреждением (не предупреждение js) над правильным полем:
Вместо этого мне нужно поле для выделения, как в примере выше.