Разбор словаря FieldList для отправки в базу данных

Использование Formfields и Fieldlists с WTForms отправляет словарь элементов с формой submit.

Вот пример:

data = {
...   "stepset-0-recipe_step_id": "5",
...   "stepset-0-recipe_step_name": "boil rice",
...   "stepset-0-recipe_step_temp": "42.0",
...   "stepset-1-recipe_step_id": "6",
...   "stepset-1-recipe_step_name": "heat rice",
...   "stepset-1-recipe_step_temp": "57.0",
}

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

Каждые 3 строки должны быть добавлены к записи в базе данных. Итак, как мне это сделать?

В настоящее время я изучаю регулярное выражение, чтобы получить число в ключе, 'recipe_step_id' и т. д., чтобы соответствовать значениям в строке базы данных.

Другой вопрос: я предполагаю, что здесь важно иметь идентификатор, поскольку список полей, похоже, не отправляет объект базы данных, я прав? Нужно ли как-то скрывать это поле (я не хочу, чтобы пользователи могли редактировать или видеть его на самом деле).


person jt196    schedule 18.06.2021    source источник


Ответы (1)


Таким образом, ответ был значительно сложнее, чем я думал для встроенной функции WTForms. Я нашел способ здесь изменить плоский словарь на вложенный словарь. Моя функция почти идентична, кроме метода разделения справа:

def nest_once(inp_dict):
    out = {}
    if isinstance(inp_dict, dict):
        for key, val in inp_dict.items():
            if '-' in key:
                head, tail = key.rsplit('-', 1)

                if head not in out.keys():
                    out[head] = {tail: val}
                else:
                    out[head].update({tail: val})
            else:
                out[key] = val
    return out

Затем я прошелся по этому списку, добавляя указанные значения в базу данных:

@app.route('/recipe/recipesteps/<int:recipe_id>/update', methods=['GET', 'POST'])
def updaterecipesteps(recipe_id):
    recipe = Recipe.query.get_or_404(recipe_id)
    data = request.form
    nested_data = nest_once(data)
    for key, val in nested_data.items():
        recipe_step_id = val['recipe_step_id']
        recipe_step = RecipeSteps.query.get_or_404(recipe_step_id)
        recipe_step_temp = val['recipe_step_temp']
        recipe_step_name = val['recipe_step_name']
        recipe_step.name = recipe_step_name
        recipe_step.step_temp = recipe_step_temp
        db.session.commit()
    return redirect(url_for('recipe', recipe_id=recipe.id))

Я буду немного чистить это в какой-то момент, но в настоящее время это работает.

person jt196    schedule 18.06.2021