Wtforms - запись данных списка полей в MySQL - PullRequest
0 голосов
/ 10 октября 2018

Предположим, у меня есть такая форма:

Toys= FieldList(TextField('what toys do you have?'),min_entries=5)
Fruits= FieldList(TextField('what fruits do you have?'),min_entries=5)
Jewelry= FieldList(TextField('what jewelries do you have?'),min_entries=5)
Candy= FieldList(TextField('what candies do you have?'),min_entries=5)

без явного определения отправленных значений, таких как Toy1=form.Toys[1].data, как я могу агрегировать все данные FieldList в отправке формы для записи в таблицу SQL, напримерИтак:?

Toys | Fruits | Jewelry | Candy
ball  apple    Necklace  M&Ms
stick orange   Bracelet  skittles
top   grapes   tie clip  lollipop

Ради простоты я установил min_entries=5 для всех полей.Я попытался использовать цикл for для добавления имен столбцов и значений в словарь и записи их в свою базу данных следующим образом:

field_dict=dict()
    for f in form:
        if str(f.type) in ['FieldList']:
            for x in range(1,5):
                field_dict.update({f.name:f.data[x]})
                    sql_insert="INSERT INTO tablename ({}) values ({})".format(
                        ",".join(field_dict.keys()),
                        ",".join('"' + str(value) + '"' for value in field_dict.values()))
                    c.execute(sql_insert)

Однако он записывает в базу данных каждый раз, когда встречает Fieldlist, в результате чеготаблица как:

 Toys | Fruits | Jewelry | Candy
ball   NULL       NULL     NULL
ball   apple      NULL     NULL
ball   apple     Necklace  NULL
ball   apple     Necklace  M&Ms

1 Ответ

0 голосов
/ 11 октября 2018

Мое чтение вопроса заключается в том, что у вас есть список записей из вашей формы, которые вы хотите объединить в кортеж и вставить в базу данных.

Чтобы сэкономить, набрав несколько слов, скажем, у вас есть:

# some list of keys obtained or hard coded as global..
KEYS = ['Toys', 'Fruits', 'Candy']

# and a form in which you have
Toys= FieldList(TextField('what toys do you have?'),min_entries=3)
Fruits= FieldList(TextField('what fruits do you have?'),min_entries=3)
Candy= FieldList(TextField('what candies do you have?'),min_entries=3)

Теперь ваша задача состоит в том, чтобы зациклить форму и упаковать кортеж:

form = Form()
for _i in range(3):
    tup = ()
    for key in KEYS:
        tup += (getattr(form, key)[_i].data,)
    sql = "INSERT INTO tablename ({}) values {}".format(
              ",".join(KEYS), str(tup))
    c.execute(sql)

Дайте ему (или некоторому отлаженному производному!) Попытку

...