【发布时间】:2013-11-11 20:26:45
【问题描述】:
我想知道是否可以在实例化之前更改或更改表单类。
作为一个具体的例子,我有一个支付表单,需要根据所使用的支付系统进行修改。
理想情况下,我宁愿不创建不同的表单类,然后根据支付系统选择不同的表单类;相反,支付系统对象将“告诉”表单类它需要进行哪些更改——例如,使某些字段可选或指示它们使用不同的小部件。
这可能吗?另一种方法是将代表支付系统的对象传递到表单中,然后让它在实例化后修改表单,但是让它在表单类而不是视图中运行似乎有点笨拙。我觉得 Django 的“视图”更接近于控制器,而且似乎这就是应该发生这种事情的地方。我也觉得修改它会更好地修改 form_class 对象而不是表单实例;我什至不确定当您在这样的事实之后添加字段时,它是否会正确处理验证和表单填写。会吗?
在任何地方,这里有一些示例代码,说明如何将支付对象传递给表单实例化调用:
payment_system.py:
class ExamplePaymentSystem(BasePaymentSystem):
def modify_form(self, form):
for fld in self.optional_fields:
form.fields[fld].required = False
…etc…
forms.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)
【问题讨论】:
-
那么,您宁愿让
payment_system修改表单,还是为每个支付系统创建多个表单类?问题的描述似乎与标题相矛盾。 -
不管你如何描述它,我更喜欢表单类,而不是表单实例。我给出的示例使用了表单实例,因为我不确定修改表单类的好方法。我希望更改表单类以匹配支付系统的需求。对于给定的购买请求,只有一个支付系统在使用,所以我不需要它来一次创建一堆表单类;我只需要它为该支付系统创建正确的表单。完美的例子是Stripe,其中支付字段应该不有名称。
标签: python django django-forms