如何在MongoDB中构造表单数据(Python / Flask)

时间:2018-12-12 12:11:51

标签: python html mongodb flask pymongo

我无法根据用户表单在MongoDB中构造数据。

我理想的文档结构是:

enter image description here

如您所见,成分位于可迭代的数组中。

但是,在提交表单时,我无法找到一种方法。我的“成分”部分表格如下:

 <h4>Ingredients</h4>
        </div>
        <div class="row">
            <div class="input-field col s6">
                <input id="ingredients_1_name" name="ingredients_name_1" type="text" class="validate" required>
                <label for="ingredients_1_name">Ingredient</label>
            </div>
            <div class="input-field col s3">
                <input id="ingredients_1_quantity" name="ingredients_quantity_1" type="text" class="validate" required>
                <label for="ingredients_1_quantity">Quantity</label>
            </div>
            <div class="input-field col s3">
                <input id="ingredients_1_unit" name="ingredients_unit_1" type="text" class="validate" required>
                <label for="ingredients_1_unit">Unit</label>
            </div>
        </div>

用户可以按下JavaScript按钮,添加一个名为“ ingredients_2_name”的新行,依此类推。这导致了一个非常非结构化的数据库:

enter image description here

这显然是一团糟,在使用数据时需要不必要的操作。

我似乎在网上找不到任何有关如何以定义的方式将数据从HTML表单发送到MongoDB的信息。

当前提交表单时,视图如下:

@app.route('/insert_recipe/', methods=['GET','POST'])
def insert_recipe():
    """
    This function is called when a user clicks the submit button on the add
    recipe form. Uses the insert_one() method to add to the recipes document.
    """
    recipes = mongo.db.recipes
    dictionary = recipes.insert_one(request.form.to_dict())
    return redirect(url_for("get_recipes"))

这只是将输入名称作为键,将用户输入作为值。

有人能描述我如何以结构化方式在MongoDB中存储表单数据吗?

1 个答案:

答案 0 :(得分:0)

您需要的是将纯HTML表单发布请求转换为类似JSON的结构,而无需任何数据操作。我非常怀疑这是否可能,因为JSON对象使用嵌套数据,并且键/索引方法可以访问它,而HTML-form-post数据是 flat 并且遵循唯一性-id-approach来访问它的数据。我可以看到2种可能的解决方案:

  1. 使用序列化库WTForms,它将为您执行python-data-> html-form-> python-data转换,您无需自己进行不必要的操作。< / li>
  2. 向您发出网页(前端)发布请求作为JSON对象。