qwe*_*rty 5 python flask flask-wtforms
我试图用一个参数定义一个 Flask 表单。这是我的方法:
forms.py
class RegisterPatternForm(FlaskForm):
cursorPatients = MongoClient('localhost:27017').myDb["coll"].find({"field1": self.myParam}).sort([("id", 1)])
patientOpts = []
for pt in cursorPatients:
row = (str(pt.get("id")), "{} {}, {}".format(pt.get("surname1"), pt.get("surname2"), pt.get("name")))
patientOpts.append(row)
patients = SelectMultipleField('Select the patient', validators=[Optional()], choices=patientOpts)
submit = SubmitField('Register')
def __init__(self, myParam, *args, **kwargs):
super(RegisterPatternForm, self).__init__(*args, **kwargs)
self.myParam = myParam
Run Code Online (Sandbox Code Playgroud)
routes.py
myParam = 5
form = RegisterPatternForm(myParam)
Run Code Online (Sandbox Code Playgroud)
基本上,我想读取在 form 上myParam定义的变量。在作品中插入参数,以及在. 它失败的地方是读取以.routes.pyRegisterPatternFormroutes.py__init__RegisterPatternFormcursorPatients
因此,我的问题是,如何解决此问题才能读取myParam表单中的值?
关于问题。
cursorPatients// patientsetc是类级别的变量(staticvariable)。这意味着你还没有instance达到properties这个级别。粗略地说,您试图self访问一个对象,但对象尚未创建。
如果我理解正确的话,你需要choices使用Form property.
让我们尝试使用以下方法更改选择__init__:
class RegisterPatternForm(FlaskForm):
patients = SelectMultipleField('Select the patient',
validators=[Optional()],
choices=[('one', 'one')])
def __init__(self, patients_choices: list = None, *args, **kwargs):
super().__init__(*args, **kwargs)
if patients_choices:
self.patients.choices = patients_choices
RegisterPatternForm() # default choices - [('one', 'one')]
RegisterPatternForm(patients_choices=[('two', 'two')]) # new choices
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,patients选择正在改变,使用 constructor . 所以在你的情况下应该是这样的:
class RegisterPatternForm(FlaskForm):
patients = SelectMultipleField('Select the patient',
validators=[Optional()],
choices=[])
def __init__(self, myParam: int, *args, **kwargs):
super().__init__(*args, **kwargs)
self.myParam = myParam
self.patients.choices = self._mongo_mock()
def _mongo_mock(self) -> list:
"""
db = MongoClient('localhost:27017').myDb["coll"]
result = []
for pt in db.find({"field1": self.myParam}).sort([("id", 1)]):
blablabla....
return result
Just an example(I `mocked` mongo)
"""
return [(str(i), str(i)) for i in range(self.myParam)]
form1 = RegisterPatternForm(1)
form2 = RegisterPatternForm(5)
print(form1.patients.choices) # [('0', '0')]
print(form2.patients.choices) # [('0', '0'), ('1', '1'), ('2', '2'), ('3', '3'), ('4', '4')]
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助。
| 归档时间: |
|
| 查看次数: |
935 次 |
| 最近记录: |