Python 如何将WTForms FormField与其他参数一起使用?
我得到了带有参数资源的表单LimitFormPython 如何将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在其他表单中使用此表
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请更新您的问题,而不是链接。我想看看你的视图功能