2012-07-06 2 views
4

У меня есть форму с wtform, я хочу добавить новую форму JobItemForm в мою форму JobForm используя append_entry. JobItemForm имеет selectField с именем company. Добавить данные в поле выбора с помощью модели, как этогоКак добавить новый wtforms FormField с исходными данными по умолчанию?

form.jobs[0].company.choices = company_list 

теперь я использую append_entry без каких-либо вариантов и я получаю сообщение об ошибке. Итак, как я могу позвонить append_entry с некоторыми исходными данными?

class JobItemForm(Form): 
    company = SelectField(_('company'), description=_('<a href="/education/institute/add/">new company"</a>')) 
    title = TextField(_('title'), [validators.Length(min=4, max=250)]) 
    date_from = DateField(_("date_from"), format='%Y-%m-%d') 
    date_to = DateField(_("date_to"), format='%Y-%m-%d') 
    description = TextAreaField(_('description')) 


class JobForm(Form): 
    jobs = FieldList(FormField(JobItemForm), min_entries=3) 
    add_job = SubmitField(_('Add job')) 

некоторые вещи, как этот

@mod.route('/edit/', methods=['GET', 'POST']) 
@login_required 
def edit_job(): 
    """ 
    edit job 
    """ 
    company_list = Company.Company_list() 
    form_title = "Edit job Form" 
    if request.method != 'POST': 
     form = JobForm() 
     form.jobs[0].company.choices = company_list 
     return render('form.html', form=form, form_title=form_title) 
    form = JobForm(request.form) 
    if form.add_job.data: 
     new_item_job = form.jobs.append_entry() 
     new_item_job.company.choices = company_list 
     return render('form.html', form=form, form_title=form_title) 

    form.validate 
    if form.errors != dict(): 
     return render('form.html', form=form, form_title=form_title) 
    # save data 
    flash(_("Edit successfully!")) 
    return render('registration/succesful.html') 
+0

Попробуйте запустить его и посмотреть, есть ли ошибка и разместите его здесь. Я думаю, что все должно быть хорошо. – codecool

+0

@codecool сначала я думаю, что форма.jobs [0] .company.choices = company_list - очень уродливый код, и он должен сделать другой путь на второй после add_job, он сказал, что один из элементов имеет noe-выбор – Efazati

ответ

5

Существует лучший способ сделать это:

form.jobs[0].company.choices = company_list 

Wtforms имеет расширения для GAE, Джанго и SQLAlchemy, который поддерживает ОРМ при поддержке полей формы. Documentation of extensions.

Для SQLAlchemy, это работает так:

from wtforms.ext.sqlalchemy.fields import QuerySelectField 

    def fill_field(): 
     return Model.query 

    myfield = QuerySelectField(query_factory=fill_field) 

Этот фрагмент кода автоматически заполняет выбор для вас от модели базы данных.

(я не имею вам фактические ошибки, так что я просто предполагаю здесь)

Причина вы получаете не ошибка после того, как ваш выбор add_job, потому что вы заполняете выбор только тогда, когда это запрос GET. Вам необходимо добавить варианты после запроса на сообщение так:

def your_view(): 
     form = YourForm() 
     form.fieldname.choices = choice_list 
     # Here comes your code for GET and POST request both 
+0

, если я добавляю после каждого запроса didnt remove данные? – Efazati

+1

Нет, он не удаляет данные. Я тоже так думал, когда впервые использовал этот атрибут выбора формы, но для каждого запроса ему нужно заполнить выбор. Обратите внимание, что это не требуется при использовании QuerySelectField. – codecool