我在Django中创建了一个自定义表单对象,它有一个被覆盖的__init__方法。重写该方法的目的是基于新参数动态生成下拉框。
例如,
class TicketForm(forms.Form):
Type = Type.GetTicketTypeField()
def __init__(self, data=None, files=None, auto_id='id_%s', prefix=None,
initial=None, label_suffix=':', empty_permitted=False,
ticket=None):
if ticket:
self.__class__.State = State.GetTicketStateField(ticket.Type)
super(forms.BaseForm, self ).__init__(data=data, files=files,
auto_id=auto_id, prefix=prefix, initial=initial,
label_suffix=label_suffix, empty_permitted=empty_permitted)
此解决方案不起作用。这些字段似乎是在调用__init__之前创建的。我认为这个问题是很常见的。Django处理这类问题的方式是什么?
发布于 2009-05-15 22:13:04
您可以使用self.fields
dict动态修改表单。像这样的东西可能会对你有用:
class TicketForm(forms.Form):
Type = Type.GetTicketTypeField()
def __init__(self, ticket, *args, **kwargs):
super(TicketForm, self).__init__(*args, **kwargs)
self.fields['state'] = State.GetTicketStateField(ticket.Type)
发布于 2009-05-15 22:14:06
我找到了一个解决方案here。如果有更好的解决方案,请回复。
class TicketForm(forms.Form):
Type = Type.GetTicketTypeField()
def __init__(self, ticket=None, *args, **kwargs):
super(TicketForm, self ).__init__(*args, **kwargs)
if ticket:
self.fields['State'] = State.GetTicketStateField(ticket.Type)
发布于 2021-02-08 06:51:59
不要修改__init__()
参数。您可能会破坏与Django未来版本的兼容性,并使您的代码更难维护。
我建议使用kwargs
来传递您的变量。
class TicketForm(forms.Form):
type = Type.GetTicketTypeField()
def __init__(self, *args, **kwargs):
ticket = kwargs.pop('ticket')
super().__init__(*args, **kwargs)
if ticket:
self.fields['state'] = State.GetTicketStateField(ticket.Type)
https://stackoverflow.com/questions/871037
复制相似问题