Python 带参数的烧瓶形式

Python 带参数的烧瓶形式,python,flask,flask-wtforms,Python,Flask,Flask Wtforms,我试图用一个参数定义一个烧瓶形式。这就是我的方法: forms.py class RegisterPatternForm(FlaskForm): cursorPatients = MongoClient('localhost:27017').myDb["coll"].find({"field1": self.myParam}).sort([("id", 1)]) patientOpts = [] for pt in cursorPatients: row

我试图用一个参数定义一个烧瓶形式。这就是我的方法:

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
myParam = 5
form = RegisterPatternForm(myParam)
routes.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
myParam = 5
form = RegisterPatternForm(myParam)
基本上,我想读取
RegisterPatternForm
表单上
routes.py
上定义的变量
myParam
。在
routes.py
中插入参数有效,在
RegisterPatternForm
中插入
初始化
方法也有效。当读取以
光标或患者
开头的行上的字段时失败

因此,我的问题是,如何解决此问题,以便能够读取表单中的
myParam
值?

关于此问题

cursorPatients
/
patients
/etc是一个类级变量(
静态变量)。这意味着您没有此级别的
实例
属性
。粗略地说,您试图使用
self
访问对象,但对象未被创建

如果我理解正确,您需要使用
表单属性更改一些
选项

让我们尝试使用
\uuuu init\uuu
更改选项:

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
正如您可以看到的那样,
患者
选择正在使用
构造器
进行更改。所以在你的情况下,应该是这样的:

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')]
希望这有帮助