Python 如何将WTForms FormField与其他参数一起使用?

Python 如何将WTForms FormField与其他参数一起使用?,python,flask,wtforms,flask-wtforms,Python,Flask,Wtforms,Flask Wtforms,我得到了带有参数资源的表单LimitForm class LimitForm(FlaskForm): def __init__(self, resource: Resource, *args, **kwargs): super(LimitForm, self).__init__(*args, **kwargs) self.period.choices = Period.choices() 我想通过FormField在其他表单中使用此表

我得到了带有参数资源的表单LimitForm

class LimitForm(FlaskForm):
        def __init__(self, resource: Resource, *args, **kwargs):
           super(LimitForm, self).__init__(*args, **kwargs)
           self.period.choices = Period.choices()
我想通过FormField在其他表单中使用此表单作为字段。像一个

class LimitsForm(FlaskForm)
   limits = FieldList(FormField(LimitForm))
但此代码引发异常TypeError:\uuuu init\uuuu()缺少1个必需的位置参数:“resource”

如何将资源从LimitsForm传递到LimitForm


感谢

您可能会发现,在封装类的正常初始化之后,执行一些额外的逻辑会更容易,例如,使用特殊的逻辑在末尾实现您自己的
限制表单。否则,您可能必须对
字段列表
表单字段
进行子类化,并覆盖它们的
过程
方法,如果您只需要为一个用例执行一个简单的额外步骤,那么您的生活将变得复杂

例如,我想做一件类似于您请求的事情,并通过
FormField
传递一些特殊的Kwarg。默认情况下,Flask WTF似乎不会这样做。在本例中,我使用的是一个
QuerySelectField
,当我调用SQLAlchemy时,我想通过它传递一些特殊的过滤器

在我的控制器中,对它的调用如下

form = CampaignForm(obj=campaign, studio=campaign.studio)
这里,studio是一个特殊过滤器的一部分,只有在运行时才知道。但是,这个
studio
kwarg不能通过嵌套的
FormField

因为我必须扩展和重新布线Flask WTF中的核心逻辑,以便将这个kwarg通过FormField并进入
GatingExtraForm
,所以我解决这个问题的方法是这样做:

class GatingExtraForm(FlaskForm):
    class Meta:
        # we do not need CSRF in sub-forms
        csrf = False

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        self.set_query(studio=kwargs.get('studio'))

    # when this form is nested in a FormField, the studio kwarg may not be passed to __init__, 
    # therefore we make this method available for some post-initialization.
    def set_query(self, studio=None):
        self.gating_campaign.query = db.query(InAppCampaign).filter(InAppCampaign.active)

        if studio:
            self.gating_campaign.query = self.gating_campaign.query.filter(InAppCampaign.studio == studio)

        self.gating_campaign.query = self.gating_campaign.query.order_by(InAppCampaign.name)

    gating_campaign = QuerySelectField(
        "Gating Campaign",
        get_label='name',
        allow_blank=False,
        validators=[validators.Optional()]
    )
    # additional fields here....

class CampaignForm(FlaskForm):

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        # because there is no naive way to pass kwargs through on FormField init, 
        # just do some post init special processing
        self.gating_extra.form.set_query(studio=kwargs.get('studio'))

    # additional fields here....
    gating_extra = FormField(GatingExtraForm)

我承认,这有点像黑客,但有时对于罕见的用例来说,这是一个合理的权衡。如果这是一种常见的模式,那么您可以更深入地扩展Flask WTF。

您能告诉我引发此异常的确切代码吗?@RajaSimon Oh请更新您的问题,而不是链接。我想看看你的视图功能