2015-11-18 2 views
0

Я пробовал почти целый день при простом рендеринге поля формы. Было бы здорово, если бы вы могли помочь мне в этом.SelectField WTForm рендеринг на шаблоне

Я использую Flask-WTF, python 2.7.

Я пытаюсь отобразить SelectField с помощью специального ListWidget. Поле в основном должно быть представлено в HTML-теге UL, а не в теге SELECT html, и, похоже, это то, с чем я борюсь.

Это как мой пользовательский класс виджета:

widget.py

class CustomListWidget(ListWidget): 

    def __init__(self, *args, **kwargs): 
     super(CustomListWidget, self).__init__(*args, **kwargs) 

    def __call__(self, field, **kwargs): 
     kwargs.setdefault('id', field.id) 
     html = ['<{} {}>'.format(self.html_tag, html_params(**kwargs))] 
     for subfield in field: 
      html.append('<li><span>{}</span></li>'.format(subfield())) 
     html.append('</{}>'.format(self.html_tag)) 
     return HTMLString(''.join(html)) 

Это как моя форма выглядит, а поле категории является один я борюсь с.

form.py

from widget import CustomListWidget 
from wtforms import SelectField, SubmitField 


widget = CustomListWidget(html_tag='ul') 

class MyForm(Form): 
    category = SelectField('category', [DataRequired()], widget=widget, default='1', choices=[ 
     ('1', 'whatever'), 
     ('2', 'whatever2') 
    ]) 
    submit = SubmitField('Search') 

view.py

from form import MyForm 
from flask import render_template 

@app.route('/formtest', methods=['GET', 'POST']) 
def formtest(): 
    form = MyForm() 
    if request.method == 'GET': 
     render_template('form.html', form=form) 

    if form.validate_on_submit(): 
     return redirect(url_for('whatever', data=-form.data)) 
    return 'form not validated' 

form.html

<div class="search-input with-dropdown"> 
    <div class="dropdown"> 
     {{ form.category(class='dropdown-content hide') }} }} 
    </div> 
</div> 

С помощью этого кода я могу г и ожидается ожидаемое отображение, но никакое значение не передается из поля. Какое бы значение я ни выбрал, после отправки, только значение по умолчанию есть.

+0

Что библиотеки вы используете? Вы не можете опустить поле, так форма отправляет значения. Библиотека, вероятно, ожидает скрытое поле для хранения значения и список для его отображения. Пожалуйста, [править], чтобы включить [mcve]. – davidism

+0

Сделаю сейчас. Спасибо за руководство. Впервые я задаю вопрос. –

ответ

2

Я сделал что-то подобное недавно с циклом, чтобы перебирать все варианты. В принципе, я создал копию SelectMultipleField, чтобы иметь свой собственный html для этого, поскольку нам нужны конкретные вещи.

Как видно из приведенного ниже списка, я перебираю field.iter_choices().

{%- if field.type in ['SelectMultipleField'] %} 
    <ul> 
    {% for key, value, checked in field.iter_choices() %} 
     <li>{{ value }}</li> 
    {% endfor %} 
    </ul> 
{%- endif %} 

Вы можете прочитать больше о пользовательских виджетов в http://wtforms.simplecodes.com/docs/0.6/widgets.html

+0

Спасибо, это помогло мне найти решение. –

+0

Ссылка не работает. – Guido