Python / Flask, запрос идентификатора из выпадающего списка с опциями SQLite - PullRequest
0 голосов
/ 13 июня 2019

Я пытаюсь выбрать идентификаторы с выпадающим списком и добавить их в свою таблицу без использования JSON, но постоянно получаю ту же ошибку:

werkzeug.exceptions.HTTPException.wrap..newcls: 400 Плохо Запрос: 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 %}

Спасибо за предоставленную помощь:)

1 Ответ

0 голосов
/ 13 июня 2019

Вам необходимо добавить значение имени, чтобы выбрать <select name='mateType'>...</select>, <select name='nomFabri'>...</select>. Еще одна проблема, вам нужно удалить 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='')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...