2009-05-15 36 views
18

Tôi đang tạo đối tượng biểu mẫu tùy chỉnh ở Django có phương thức __init__ bị ghi đè. Mục đích của việc ghi đè phương thức này là tự động tạo các hộp thả xuống dựa trên các tham số mới.Django: Ghi đè __init__ cho Biểu mẫu tùy chỉnh

Ví dụ,

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) 

Giải pháp này không hoạt động. Dường như các trường được tạo trước khi __init__ được gọi. Tôi cho rằng vấn đề này sẽ khá phổ biến. Điều gì sẽ là cách Django xử lý các lớp học của các vấn đề.

Trả lời

33

Bạn có thể tự động sửa đổi biểu mẫu của mình bằng cách sử dụng số self.fields dict. Nội dung như thế này có thể phù hợp với bạn:

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) 
2

Tôi đã tìm thấy giải pháp here. Nếu có giải pháp tốt hơn, vui lòng đăng câu trả lời.

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) 
Các vấn đề liên quan