首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Django:覆盖自定义表单的__init__

Django:覆盖自定义表单的__init__
EN

Stack Overflow用户
提问于 2009-05-15 22:00:05
回答 3查看 44.2K关注 0票数 26

我在Django中创建了一个自定义表单对象,它有一个被覆盖的__init__方法。重写该方法的目的是基于新参数动态生成下拉框。

例如,

代码语言:javascript
复制
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处理这类问题的方式是什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-05-15 22:13:04

您可以使用self.fields dict动态修改表单。像这样的东西可能会对你有用:

代码语言:javascript
复制
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)
票数 52
EN

Stack Overflow用户

发布于 2009-05-15 22:14:06

我找到了一个解决方案here。如果有更好的解决方案,请回复。

代码语言:javascript
复制
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)
票数 6
EN

Stack Overflow用户

发布于 2021-02-08 06:51:59

不要修改__init__()参数。您可能会破坏与Django未来版本的兼容性,并使您的代码更难维护。

我建议使用kwargs来传递您的变量。

代码语言:javascript
复制
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)
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/871037

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档