2013-05-07 4 views
0

Всякий раз, когда я использую форму WTForms для отображения данных из базы данных:Есть ли простой способ подавить значения полей полей формы WTForms?

sql = "SELECT * FROM rolodex WHERE rolodex_id = " + rolodex_id 
cursor = mdb_connect("DictCursor") 
cursor.execute(sql) 
row = cursor.fetchone() 
form = RolodexEntry(**row) 
return bottle.template('entry',rolodex_id=rolodex_id,form=form) 

(все поля формы являются Текстовые поля)

пустые и NULL значения полей базы данных отображаются в виде «None». Я хочу, чтобы они просто были пусты. Я могу придумать пару способов решить эту проблему, но мне интересно, есть ли одобренный WTForms способ установить значение по умолчанию для текстового поля как пустую строку, а не None?

шаблоны бутылки дать мне простой, если несколько утомительный способ решения этой проблемы на индивидуальной основе:

<p style='font-weight: bold; color: blue; margin-left: auto; margin-right: auto; width: 50%'> 
% if form.firstname.data: 
    {{form.firstname.data}} 
% end 
% if form.lastname.data: 
    {{form.lastname.data}} 
% end 
</p> 

Я попытался изменить атрибут по умолчанию в определении поля:

firstname = TextField('First Name',[validators.length(max=40)], default="") 

но это ничего не делало; то есть form.firstname.data по-прежнему отображается как None, если поле пусто в базе данных.

ответ

0

Боюсь, я не могу придумать одобренный WTForms способ установить значения по умолчанию, так как все, что передается по умолчанию, будет ... well.default. Поэтому, если мы настроим таргетинг на уровне выбора базы данных, вы можете использовать что-то вроде этого вопроса;

How to override NULL value from aggregate query using MySQLdb module in python?

Так совмещая ее с кодом:

sql = "SELECT * FROM rolodex WHERE rolodex_id = " + rolodex_id 
default_value = None 
cursor = mdb_connect("DictCursor") 
cursor.execute(sql) 
row = cursor.fetchone() 
row = [value for value in row if value else default_value] 
form = RolodexEntry(*row) 
return bottle.template('entry',rolodex_id=rolodex_id,form=form) 

и использовать по умолчанию вы бы None вместо пустой строки;

firstname = TextField('First Name',[validators.length(max=40)], default=None) 

Это вообще полезно?

+0

привет - Спасибо за ваш ответ, но я не понимаю, как это помогает. В моем случае база данных содержит как пустые, так и NULL-поля (т. Е. Некоторые поля базы данных уже установлены на «»). В любом случае 'form.field_name.data' выводит как« Нет »на результирующей странице HTML (т. Е. Символы N-o-n-e). Из этого становится ясно, что любое ложное значение в строке будет распечатываться как «Нет». Поскольку я хочу, чтобы он по умолчанию просто оставил поле пустым, если значение из базы данных «False», предварительная установка значения поля в словаре не помогает (см. Следующий комментарий). – pgoetz

+0

Фактически, если я явно установил одно из полей как «" (то есть пустую строку): 'row ['cellphone'] =" "' перед передачей его форме: 'form = RolodexEntry (** row)' он по-прежнему печатается как «Нет» в файле HTML. Я не понимаю, почему это не рассматривается атрибутом поля default. – pgoetz

+0

В качестве эксперимента - что происходит, когда вы делаете то же самое снова (установите «row ['cellphone'] = '''), но установите «firstname = TextField» («Имя», [validators.length (max = 40)], default = "Test string") 'и посмотреть, что отображается. Это проверит, обрабатывает ли это 'default'. Я просто хочу посмотреть, обрабатывает ли она пустую строку как «Нет» или строку. – Ewan

1

Проблема была быть вызвана strip_filter фильтра я использовал со всеми TextFields:

strip_filter = lambda x: x.strip() if x else None 

, как в

cell = TextField('Cellphone', [validators.length(max=25)], 
       filters=[strip_filter]) 

Изменение полосы фильтр:

strip_filter = lambda x: x.strip() if x else "" 

решена Эта проблема.

Проблема была усугублена тем фактом, что атрибут поля WTForms default, похоже, не работает. Используя это определение поля:

cell = TextField('Cellphone', default = "Nada") 

и этот код:

row['cell'] = "" 
form = RolodexEntry(**row) 
return bottle.template('entry',rolodex_id=rolodex_id,form=form) 

HTML, для <td>{{form.cell.data}}</td> дает <td></td>, а не <td>Nada</td>

+0

В дальнейших экспериментах теперь ясно, что атрибут поля по умолчанию WTForms используется только в том случае, если поле полностью отсутствует. В частности, в предыдущем примере кода замените 'row ['cell'] =" "' на 'del row ['cell']', а значение по умолчанию Nada запустится для 'form.cell.data' – pgoetz

0

Эта проблема возникла мне сегодня, но я использую Flask_WTF, так что мой синтаксис отличается. Мое решение было решено, добавив Optional() в мой список validators[].

address_zip_extension = StringField('address_zip_extension', render_kw={"placeholder": "Zip Extension", "section": "address", 
            'label': 'Zip Extension'}, validators=[Optional(), Length(min=4, max=5)]) 

Для нормального WTForms, синтаксис отличается, но я считаю, что-то вроде следующего должно работать.

class MyForm(Form): 
    name = TextField('Name', [Optional(), my_length_check]) 

Удачи вам!