【发布时间】:2020-03-30 10:22:52
【问题描述】:
我希望能够生成一个 for 循环,该循环显示用户当前可用的所有处方,如果当前用户是药剂师,则在该行旁边有一个类似提交的按钮,当它减少该处方的当前计数时被点击。目前正在尝试减少 current_count 当我知道处方ID = current_user.prescription_id 时不正确,特别是对于有多个处方的情况。现在可以正常显示所有内容,但会抛出错误,提示“用户”对象没有属性“处方 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>
【问题讨论】:
标签: html flask sqlalchemy jinja2