Я хочу иметь возможность сгенерировать для 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>