Python/Flask,来自dropdownlist的请求ID用SQLi填充选项

2024-09-28 03:12:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试使用下拉列表选择ID,并将其添加到我的表中,而不使用JSON,但我不断收到相同的错误:

werkzeug.exceptions.HTTPException.wrap..newcls: 400 Bad Request: KeyError: 'nomFabri'

我有三张桌子: https://i.stack.imgur.com/W7v7x.png (遗憾的是,还不能发布图片)

我以为它可以很好的工作,并试图乱搞我的专栏,没有多少成功。我从我的研究中得到的大部分都是使用JSON,没有它就没有解决方法了吗

这是密码

@bp.route('/Appareil', methods=['GET', 'POST'])
def Appareil():
    db = get_db()
    materielTypes = db.execute(
       'SELECT * FROM t_type'
    ).fetchall()
    fabriquants = db.execute(
        'SELECT * FROM t_fabriquant'
    ).fetchall()
    return render_template('materiel/appareil.html',
    materielTypes=materielTypes, fabriquants=fabriquants)

@bp.route('/AddAppareil', methods=['GET', 'POST'])
def AddAppareil():
    if request.method == 'POST':
        nomModele = request.form['nomModele']
        numeroProduit = request.form['numeroProduit']
        nomFabri = request.form['nomFabri']
        matType = request.form['matType']
        error = None
    if not nomModele:
        error = 'Faux.'
    if error is not None:
        flash(error)
    else:
        db = get_db()
        db.execute(
            'INSERT INTO t_appareil (nomModele, numeroProduit, nomFabri, mattype)'
            ' VALUES (?, ?, ?, ?)',
            (nomModele, numeroProduit, nomFabri, matType,)
        )
        db.commit()
        return redirect(url_for('materiel.appareil'))
    return render_template('materiel/appareil.html')

这是表格

{% extends 'base.html' %}

{% block header %}
  <h1>{% block title %}nouvel appareil{% endblock %}</h1>
{% endblock %}

{% block content %}
  <form method="post" class="insertdata" action="/AddAppareil">
    <select>
      {% for materielType in materielTypes %}
      <option name="matType" id="matType" value="{{ request.form['id_type'] }}">{{ materielType['materielType'] }}</option>
      {% endfor %}
    </select>
    <select>
        {% for fabriquant in fabriquants %}
        <option name="nomFabri" id="nomFabri" value="{{ request.form['id_fabriquant']] }}">{{ fabriquant['nomFabr'] }}</option>
        {% endfor %}
      </select>
    <input type="text" name="nomModele" id="nomModele" placeholder="nom du Modele" value="{{ request.form['nomModele'] }}" required>
    <input type="text" name="numeroProduit" id="numeroProduit" placeholder="Numéro de série" value="{{ request.form['numeroProduit'] }}" required>
    <input type="submit" value="Save">
  </form>
{% endblock %}

感谢您的帮助:)


Tags: formiddbvaluerequesttypeerrormattype
1条回答
网友
1楼 · 发布于 2024-09-28 03:12:18

您需要添加name值来选择<select name='mateType'>...</select><select name='nomFabri'>...</select>。另一个问题是,您需要从select和input字段中删除value="{{ request.form['nomModele'] }}"

您的python代码将类似于:

@bp.route('/AddAppareil', methods=['GET', 'POST'])
def AddAppareil():
    nomModele = ''
    numeroProduit= ''
    nomFabri= ''
    matType= ''
    if request.method == 'POST':
        nomModele = request.form['nomModele']
        numeroProduit = request.form['numeroProduit']
        nomFabri = request.form['nomFabri']
        matType = request.form['matType']
        error = None
        if not nomModele:
           error = 'Faux.'
        if error is not None:
           flash(error)
        else:
           db = get_db()
           db.execute(
           'INSERT INTO t_appareil (nomModele, numeroProduit, nomFabri, mattype)'
           ' VALUES (?, ?, ?, ?)',
            (nomModele, numeroProduit, nomFabri, matType,))
           db.commit()
           return redirect(url_for('materiel.appareil'))
    db = get_db()
    materielTypes = db.execute(
       'SELECT * FROM t_type'
    ).fetchall()
    fabriquants = db.execute(
        'SELECT * FROM t_fabriquant'
    ).fetchall()
    return render_template('materiel/appareil.html',
    nomModele = nomModele, numeroProduit=numeroProduit,
    nomFabri=nomFabri, matType=matType,
    materielTypes=materielTypes,fabriquants = fabriquants)

appareil.html文件类似于:

{% extends 'base.html' %}

{% block header %}
  <h1>{% block title %}nouvel appareil{% endblock %}</h1>
{% endblock %}

{% block content %}
  <form method="post" class="insertdata" action="/AddAppareil">
    <select name='matType'>
      {% for materielType in materielTypes %}
      <option value="{{ materielType['id_type'] }}"
      {% if matType == materielType['id_type'] %} selected {% endfor %} >
      {{ materielType['materielType'] }} 
      </option>
      {% endfor %}
    </select>

    <select name="nomFabri" id="nomFabri">
        {% for fabriquant in fabriquants %}
        <option value="{{ fabriquant['id_fabriquant'] }}"
        {% if nomFabri == fabriquant['id_fabriquant'] %} selected {% endfor %}>
        {{ fabriquant['nomFabr'] }}
        </option>
        {% endfor %}
    </select>
    <input type="text" name="nomModele" id="nomModele" placeholder="nom du Modele"
    value="{{ nomModele }}" required>
    <input type="text" name="numeroProduit" id="numeroProduit"
    placeholder="Numéro de série" value="{{ numeroProduit }}" required>
    <input type="submit" value="Save">
  </form>
{% endblock %}

您需要为表单字段添加一些默认值:

@bp.route('/Appareil', methods=['GET', 'POST'])
def Appareil():
    #...
    return render_template('materiel/appareil.html',
    materielTypes=materielTypes, fabriquants=fabriquants
    nomModele = '',
    numeroProduit= '',
    nomFabri='',
    matType='')

相关问题 更多 >

    热门问题