Как получить элемент из HTML выберите в Python Flask - PullRequest
0 голосов
/ 28 мая 2019

Примечание:

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

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

Я пробовал:

Для записи имени атрибута в HTML-тег select. В бэкэнде я попробовал это два варианта type_user = request.form.get('type_user') и это type_user = request.form['type_user']

Я использую режим debbuger и вижу, что auth.py не получает никаких данных, только None.

register.html

#I don't know if it is for the desabled attribute, if the user 
#is not logged so he cannot create a admin account only a normal account.
{% if g.user['type'] == 0 %}
        <div class="form-group">
          <label for="type_user">Type of User <span style="color: red">*</span></label>
          <select class="form-control" id="type_user" name="type_user" required>
            <option value="0">Admin</option>
            <option value="1">User</option>
          </select>
        </div>
      {% else %}
      <div class="form-group">
          <label for="type_user">Type of User <span style="color: red">*</span></label>
          <select class="form-control" id="type_user" name="type_user" required disabled>
            <option value="1">User</option>
          </select>
        </div>
      {% endif %}

auth.py

@bp.route('/register', methods=('GET', 'POST'))
def register():
    if request.method == 'POST':
        first_name = request.form['first_name']
        last_name = request.form['last_name']
        type_user = int(request.form.get('type_user'))
        username = request.form['username']
        password = request.form['password']
        db = get_db()
        error = None
        print(type_user)
        print(first_name)
        if not (first_name and last_name and type_user and username and password):
            error = "Please fill all requiered fields"

        elif db.execute(
            'SELECT id FROM user WHERE username = ?', (username,)
        ).fetchone() is not None:
            error = 'User {} is already registered.'.format(username)

        if error is None:
            db.execute(
                'INSERT INTO user (first_name, last_name, type, username, password) VALUES (?, ?, ?, ?, ?)',
                (first_name, last_name, type_user, username, generate_password_hash(password))
            )
            db.commit()
            return redirect(url_for('auth.login'))

        flash(error)

    return render_template('auth/register.html')

Error

Файл "D: \ Dev \ Pattern-Project \ Study_room \ auth.py", строка 15, в регистр -----> type_user = request.form ['type_user'] <----- Файл "d: \ dev \ Pattern-Project \ my-venv \ lib \ site- packages \ werkzeug \ datastructures.py ", строка 442, в <strong>getitem повысить исключения.BadRequestKeyError (key)

1 Ответ

0 голосов
/ 28 мая 2019

Я упрощаю свой ответ, чтобы быть более ясным.

register.html - изменять это не нужно. То, что у тебя есть, работает.

auth.py - требуется незначительное изменение. Оператор if / else добавлен ниже в ваш код:

@bp.route('/register', methods=('GET', 'POST'))
def register():
    if request.method == 'POST':
        first_name = request.form['first_name']
        last_name = request.form['last_name']

        ### Start of changed section ###
        # The line below will be None if type_user is disabled
        # type_user = int(request.form.get('type_user'))
        if "type_user" in request.form:
            # Current user must be an admin and have the option to select
            # the type_user for the new user, so read it here.
            type_user = request.form["type_user"]
        else:
            # The type_user field in the form must be disabled.
            # This means a  standard user or anonymouse person
            # must be registering a new user.  So the new user
            # must be a standard user.
            type_user = 1
        ### End of changed section ###

        username = request.form['username']
        password = request.form['password']
        db = get_db()
        error = None
        print(type_user)
        print(first_name)
        if not (first_name and last_name and type_user and username and password):
            error = "Please fill all requiered fields"

        elif db.execute(
            'SELECT id FROM user WHERE username = ?', (username,)
        ).fetchone() is not None:
            error = 'User {} is already registered.'.format(username)

        if error is None:
            db.execute(
                'INSERT INTO user (first_name, last_name, type, username, password) VALUES (?, ?, ?, ?, ?)',
                (first_name, last_name, type_user, username, generate_password_hash(password))
            )
            db.commit()
            return redirect(url_for('auth.login'))

        flash(error)

    return render_template('auth/register.html')

Проблема с использованием disabled в HTML заключается в том, что он делает <select> полностью недоступным. Проверка на type_user в словаре обрабатывает этот случай, как показано выше и ниже:

if "type_user" in request.form:
    type_user = request.form["type_user"])
else:
    type_user = 1

Спасибо @roganjosh за указание на мою первоначальную ошибку, сосредоточенную на <div>.

Реализация здесь: https://github.com/johnhut/flask/tree/so-q56338730

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...