Google AppEngine: обработка формы «повторяется» StructuredProperty

Как мне работать со свойствами ndb.StructuredProperty(repeated = True) при разработке их форм и обработчиков? Рассмотрим этот пример:

У меня есть 3 типа ndb.Model: SkilledPerson, его Образование и его (работа) Опыт. Последние два являются типами SkilledPerson StructuredProperty.

class SkilledPerson(ndb.Model):
    name = ndb.StringProperty()
    birth = ndb.DateProperty()
    education = ndb.StructuredProperty(Education, repeated = True)
    experience = ndb.StructuredProperty(Experience, repeated = True)

class Education(ndb.Model):
    institution = ndb.StringProperty()
    certification = ndb.StringProperty()
    start = ndb.DateProperty()
    finish = ndb.DateProperty()

class Experience(ndb.Model):
    job_title = ndb.StringProperty()
    workplace = ndb.StringProperty()
    start = ndb.DateProperty()
    finish = ndb.DateProperty()

Как мне создать форму для сущности Квалифицированный специалист? Он будет отображать простые поля, такие как имя и рождение (StringProperty и DateProperty). Кроме того, он должен отображать группу полей для свойств StructuredProperty Образование и Опыт. Я бы представил, что форма выглядит примерно так:

<form method="post">

<h2>Skilled Person Form</h2>

    <label>Name<br> 
        <input type="text" name="name" value="{{name}}">
    </label>


    <label>Birth<br> 
        <input type="date" name="birth" value="{{birth}}">
    </label>


    <!-- Education form goes here -->

    <!-- and Experience form goes here -->

    <input type="submit">

</form>

Как включить в эту форму группы полей «Образование» и «Опыт»?

Пример формы Образование:

<form method="post">

<h2>Add Education</h2>

    <label>Institution<br> 
        <input type="text" name="institution" value="{{institution}}">
    </label>

    <label>Certification<br> 
        <input type="text" name="certification" value="{{certification}}">
    </label>

    <label>Start<br> 
        <input type="date" name="start" value="{{start}}">
    </label>

    <label>Finish<br> 
        <input type="date" name="finish" value="{{finish}}">
    </label>

    <input type="submit">

</form>

person hyang123    schedule 16.11.2013    source источник


Ответы (1)


Используя Jinja2, вы можете создать цикл для генерации HTML для каждого образования и для каждого опыта.

Вы можете использовать специальную переменную Jinja loop.index для назначения уникальных имен, таких как образование-1... образование-4: "name-{{ loop.index }}"

Если вам нужно много обрабатывать и проверять формы, вы можете использовать WTForms. См. документы: http://wtforms.readthedocs.org/en/latest/crash_course.html

И если вам нужно изменить списки образования и опыта в вашей форме, вы должны использовать javascript и jquery, чтобы добавить новые элементы (поля формы) или удалить элементы (поля формы).

person voscausa    schedule 27.11.2013