我想知道是否可以在实例化之前更改或更改表单类。
作为一个具体的例子,我有一个支付表单,需要根据所使用的支付系统进行修改。
理想情况下,我宁愿不创建不同的表单类,然后根据支付系统选择不同的表单类;相反,支付系统对象将“告诉”表单类它需要进行哪些更改——例如,使某些字段可选或指示它们使用不同的小部件。
这可能吗?另一种方法是将代表支付系统的对象传递到表单中,然后让它在实例化后修改表单,但是让它在表单类而不是视图中运行似乎有点笨拙。我觉得 Django 的“视图”更接近于控制器,而且似乎这就是应该发生这种事情的地方。我也觉得修改它会更好地修改 form_class 对象而不是表单实例;我什至不确定当您在这样的事实之后添加字段时,它是否会正确处理验证和表单填写。会吗?
在任何地方,这里有一些示例代码,说明如何将支付对象传递到表单实例化调用中:
支付系统.py:
class ExamplePaymentSystem(BasePaymentSystem):
def modify_form(self, form):
for fld in self.optional_fields:
form.fields[fld].required = False
…etc…
表格.py:
class ModifiablePaymentForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
self.payment_system = kwargs.pop("payment_system", None)
super(ModifiablePaymentSystem, self).__init__(*args, **kwargs)
self.payment_system.modify_form(self)