Flask: Как использовать значение, взятое из базы данных, в качестве входных данных для функции - PullRequest
0 голосов
/ 30 марта 2020

Я хочу иметь возможность сгенерировать для l oop, который показывает все рецепты, доступные в настоящее время для пользователя, и, если текущий пользователь является фармацевтом, рядом с этой строкой есть кнопка «Отправить как», которая уменьшает текущий счет этого рецепт при нажатии. В настоящее время я пытаюсь уменьшить значение current_count, когда prescription_id = current_user.prescription_id, что, как я знаю, неправильно, особенно для случаев с более чем одним рецептом. Прямо сейчас может отображать все нормально, но выдает ошибку, говоря, что объект «Пользователь» не имеет атрибута «prescription_id». Могли бы сделать с помощью. Код ниже.

main.py
@app.route('/patient_advice/<username>',methods=['GET', 'POST'])
@login_required
def advice(username):
    form = FillForm(request.form)
    user = User.query.filter_by(username=username).first_or_404()
    prescription = Prescriptions.query.filter_by(username=username)
    if request.method == 'POST' and form.validate():
        prescriptions = Prescriptions.query.filter_by(prescription_id=current_user.prescription_id).first()
        prescriptions.prescription_current_count = prescriptions.prescription_current_count - 1
        prescriptions.fill_date = datetime.utcnow()
        db.session.commit()
        flash('Prescription removed')
        flash(prescriptions.prescription_current_count)
    return render_template('patient_advice.html', title='Patient Advice', user=user, prescription=prescription, form=form)

.html section
<table id="patient-advice">
{% for medicine in prescription %}
    {% if medicine.prescription_name and medicine.prescription_current_count > 0 %}
     <tr>
        <td id='prescriptionRow'>
            {{ medicine.prescription_current_count }}
            {% if (medicine.prescription_current_count < 2) %}
                round
            {% else %}
                rounds
            {% endif %}
        of {{ medicine.prescription_name }} <b>issued on:</b> {{ medicine.issue_date }}<br>
        {% if medicine.fill_date %}
            Last filled on: {{ medicine.fill_date }}
        {% endif %}

        {% if (current_user.user_type=="pharmacist") %}
            <form method=post>
                <input type="hidden" name="csrf_token" value="{{ csrf_token() }}"/>
                <p>
                    {{ form.prescriptionId(cols=50, rows=4) }}<br>
                </p>
                <p>{{ form.submit() }}</p>
            </form>
        {% endif %}
    </td>
    <td>
        {% if medicine.prescription_name and medicine.prescription_current_count > 0 %} {{ medicine.issued_doctor }}{% endif %}
    </td>
</tr>
{% endif %}
{% endfor %}
</table>

forms.py:
class FillForm(Form):
    submit = SubmitField('Fill Prescription')

models.py:
class Prescriptions(UserMixin, db.Model):

    __tablename__ = "prescriptions"

    prescription_id = db.Column(db.Integer, primary_key=True)
    prescription_name = db.Column(db.String(200))
    prescription_count = db.Column(db.Integer)
    prescription_current_count = db.Column(db.Integer)
    issued_doctor = db.Column(db.String(200))
    issue_date = db.Column(db.DateTime, default=datetime.utcnow)
    fill_date = db.Column(db.DateTime, default=datetime.utcnow)
    username = db.Column(db.String(128))

    users = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=True)
    UserDetails = db.relationship('User', foreign_keys=users)

class User(UserMixin, db.Model):
    __tablename__ = "users"
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(128), unique=True)
    password_hash = db.Column(db.String(128))
    email = db.Column(db.String(120), unique=True, index=True)
    user_type = db.Column(db.String(128))
    advice = db.Column(db.String(1000))
    last_seen = db.Column(db.DateTime, default=datetime.utcnow)

Решено путем ввода данных из базы данных в качестве значения из скрытого поля в форме, измененные части ниже: main.py:

if request.method == 'POST' and form.validate():
    prescriptions = Prescriptions.query.filter_by(prescription_id=request.form.get("prescid"))
    for medicine in prescriptions:
        medicine.prescription_current_count = medicine.prescription_current_count - 1
        medicine.fill_date = datetime.utcnow()
        db.session.commit()
        flash("Prescription Filled")

соответствующие html изменения в форме:

<form method=post>
    <input type="hidden" name="csrf_token" value="{{ csrf_token() }}"/>
    <input class="form-control" name="prescid" type="hidden" value={{ medicine.prescription_id }}>
    <p>{{ form.submit() }}</p>
</form>

1 Ответ

0 голосов
/ 30 марта 2020

Исходя из моего опыта, ошибка, которую вы описываете, обычно выдается из-за проблемы с конфигурацией ваших баз данных, поэтому, возможно, дайте некоторую информацию о том, как структурирована ваша база данных? и, возможно, покажу еще немного кода, чтобы дать больше контекста.

, и я не мог не заметить эту строку в вашем HTML

{% if (current_user.user_type=="pharmacist") %}

и увидеть, что этот "current_user" нигде не определено, по крайней мере, не в коде, который вы показываете. В вашей render_template вы передаете пользователя, но имя этой переменной просто «user», а не «current_user».

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