2013-09-11 2 views
0

Я создал пользовательскую форму с использованием SQLFORM.factory.Ошибка процесса формы Web2py

Когда эта форма отправлена, происходит обратная передача, и она приходит к методу индекса моего контроллера.

Если я напишу ниже заданную строку, чтобы проверить форму, она оценивается как False.

if searchform.process().accepted:#THIS CONDITION EVALUATES TO FALSE 

Но если я заменю эту строку ниже указанной строкой, она будет равна True.

if searchform.accepts(request):#THIS CONDITION EVALUATES TO TRUE 

Ниже данного условия также не удается.

if searchform.accepts(request,session):#THIS CONDITION EVALUATES TO FALSE 

Я не знаю, почему это происходит. Я считаю, что предпочтительным условием является первый.

Код для создания этой формы дается более подробно ниже:

searchform=SQLFORM.factory(
    Field('id', 'unicode',requires=empty_to_none), 
    Field('account','unicode',requires=empty_to_none), 
    Field('fromdate','unicode',requires=empty_to_none), 
    Field('todate','unicode',requires=empty_to_none), 
    Field('name','unicode',requires=empty_to_none), 
    Field('status','integer'), 
    Field('method',requires=IS_EMPTY_OR(IS_IN_SET(['Method1','Method2','Method3'], sort=True, zero='Select'))), 
    Field('type','unicode',requires=IS_EMPTY_OR(IS_IN_SET(['Type1','Type2',], sort=True, zero='Select'))), 
    Field('altname','unicode',requires=empty_to_none), 
    Field('group','unicode',requires=IS_EMPTY_OR(IS_IN_SET(['Group1','Group2',], sort=True, zero='Select'))), 
    Field('assignee','unicode',requires=empty_to_none), 
    submit_button = 'Search' 
)  

Пожалуйста, помогите мне решить эту проблему.

ответ

0

Когда вы передаете session в .accepts(), это добавит к форме скрытое поле _formkey (и добавит то же значение к сеансу), чтобы защитить от атак CSRF. После подачи формы .accepts() подтвердит, что представленное значение _formkey соответствует значению, хранящемуся в сеансе, иначе проверка не завершится. (Примечание. Метод .process() - это просто ярлык для .accepts(request, session)).

Поскольку проверка терпит неудачу только тогда, когда вы исключаете session из .accepts(), оказывается, что (а) в представлении, скрытый _formkey поле не получает включены в форму, когда она сериализации в HTML, (б) сессия cookie не отправляется обратно на сервер с сообщением формы, и/или (c) значение _formkey как-то очищается от сеанса (например, через что-то вроде session.clear()).

Наиболее вероятным виновником является (a). Если вы создали пользовательскую форму HTML в представлении, вы должны указать скрытые поля _formname и _formkey. Самый простой способ с помощью:

{{=form.custom.end}} # includes the closing </form> tag 

или:

{{=form.hidden_fields()}} # does not include the closing </form> tag 

Значения скрытых полей в отдельных form.formname и form.formkey.

+0

Это старый пост, но, похоже, он соответствует моей проблеме. Я создал пользовательскую форму и закончил ее с помощью {{= form.custom.end}}. Отправить сбой при первой попытке (без формы в html), но позже работает. Если в контроллере я возвращаюсь (form = form.process()), он работает, но я не могу заставить его работать с keepvalues ​​= True. Любые подсказки? – Haboryme

Смежные вопросы