Когда вы создаете форму с помощью SQLFORM
, к ней добавляется специальное скрытое поле _formname
. Если опубликованные данные не содержат соответствующего поля _formname
, метод form.accepts()
завершится ошибкой. Вместо имени формы по умолчанию вы можете указать свое собственное и добавить его к опубликованным данным:
@service.run
def display_form():
request.vars._formname = 'myform'
form = SQLFORM(db.person)
if form.accepts(request.vars, formname='myform'):
return 'success'
else:
return 'failure'
Тем не менее, гораздо более простой метод состоит в том, чтобы полностью избежать формы и напрямую вставить запись (все еще используя преимущества процесса проверки с использованием метода validate_and_insert
):
@service.run
def display_form():
return db.person.validate_and_insert(**request.vars)
В противном случае будет возвращен вставленный идентификатор записи в случае успешной ошибки или ошибки проверки.
Альтернативой @service.run
является новая RESTful веб-служба функциональность:
@request.restful()
def api():
def POST(tablename, **fields):
if not tablename == 'person': raise HTTP(400)
return db.person.validate_and_insert(**fields)
return locals()
Затем вставьте запись через запрос POST по адресу:
http://mydomain.com/myapp/mycontroller/api/person