ForEach и NestedVariables в FormEncode для создания массива элементов формы в пирамиде - PullRequest
4 голосов
/ 31 августа 2011

Я использую Pyramid с FormEncode, чтобы попытаться создать и проверить список адресов.Я использую pyramid_simpleform и смотрю этот урок http://jimmyg.org/blog/2007/multiple-checkboxes-with-formencode.html и этот предыдущий вопрос Pylons FormEncode с массивом элементов формы , но у меня все еще есть некоторые проблемы.Моя структура в настоящее время выглядит следующим образом:

Схема:

from formencode import Schema, validators, ForEach, NestedVariables

class AddressSchema(Schema):
allow_extra_fields = False
addresses = validators.String(not_empty=True)

class JobSchema(Schema):
filter_extra_fields = True
allow_extra_fields = True
pre_validators = [NestedVariables()]
job_name = validators.MinLength(5, not_empty=True)
comments = validators.MinLength(5, not_empty=False)
addresses = ForEach(AddressSchema())

Шаблон:

${renderer.errorlist("addresses")}
${renderer.errorlist("job_name")}

<p><label for="job_name">Job name: </label>${renderer.text("job_name", size=30)}</p>
% for a in range(1, initial_number_of_address_fields):
    <p><label for="addresses-${a}">Address: </label>${renderer.textarea("addresses-" + str(a), cols=39, rows=6)}</p>
% endfor
${renderer.submit("submit", "Submit")}

Вид:

@view_config(route_name='add_addresses', renderer="add_addresses.mak")
def add_addresses(request):

from myproject.forms import JobSchema
from myproject.models import Job
from formencode import htmlfill, variabledecode, ForEach

initial_number_of_address_fields = 5

form = Form(request, schema=JobSchema(), variable_decode=False)
renderer = FormRenderer(form)

# if the form has been submitted
if 'submit' in request.POST:

    if form.validate(): # uses validation specified in forms.py

        # automatically bind to provided form
        obj = form.bind(Job()) # no exisiting id provided, so a new document is created
        # add some additional values
        obj.__setattr__("last_updated_on", datetime.date.today().strftime('%Y/%m/%d'))
        #save
        obj.save()
        return HTTPFound(location="/")

return {
    'title':'Add addresses',
    'initial_number_of_address_fields': initial_number_of_address_fields, 
    'renderer': renderer
}

Я вернусь актуальноошибки проверки, например, так:

{'addresses': u'Missing value'}

Но правильно заполненные значения также дают ошибку:

Входные данные должны быть похожими на dict (не a: u'dgfgfd ')

Если я изменю variable_decode на True (в настройке переменной формы), я больше не получаю никаких ошибок.Я думаю, что я должен как-то использовать variable_decode, но я не уверен, как.Как правильно проверить эти значения?

1 Ответ

0 голосов
/ 22 сентября 2011

Я написал сообщение в блоге с аналогичным использованием еще в 2009 году, оно может пригодиться:

http://www.domenkozar.com/2009/07/22/advanced-formencode-usage/

...