2013-01-14 12 views
21

Xin chào, tôi đang cố gắng sử dụng một biến đổi __init__ phương pháp hình thức, nhưng tôi gặp phải lỗi sau:Django dạng __init __() có nhiều giá trị cho tham số từ khóa

TypeError 
__init__() got multiple values for keyword argument 'vUserProfile' 

tôi cần phải vượt qua UserProfile mẫu của tôi, để có được dbname lĩnh vực, và tôi nghĩ rằng đây là một giải pháp (mẫu mã của tôi):

class ClienteForm(ModelForm): 
class Meta: 
    model = Cliente 

def __init__(self, vUserProfile, *args, **kwargs): 
    super(ClienteForm, self).__init__(*args, **kwargs) 
    self.fields["idcidade"].queryset = Cidade.objects.using(vUserProfile.dbname).all() 

Các cuộc gọi đến constructor ClienteForm() mà không POST thành công và sho w tôi hình thức chính xác. Nhưng khi biểu mẫu được gửi và hàm tạo được gọi với POST, tôi nhận được lỗi được mô tả trước đó.

Trả lời

39

Bạn đã thay đổi chữ ký của phương thức __init__ của biểu mẫu sao cho vUserProfile là đối số đầu tiên. Nhưng tại đây:

formPessoa = ClienteForm(request.POST, instance=cliente, vUserProfile=profile) 

làm đối số đầu tiên - ngoại trừ điều này sẽ được hiểu là vUserProfile. Và sau đó bạn cũng cố gắng vượt qua vUserProfile làm từ khóa arg.

Thực sự, bạn nên tránh việc thay đổi phương pháp chữ ký, và chỉ cần lấy dữ liệu mới từ kwargs:

def __init__(self, *args, **kwargs): 
    vUserProfile = kwargs.pop('vUserProfile', None) 
+0

Cảm ơn rất nhiều! hoạt động tốt bây giờ .. Tôi giữ chữ ký là mặc định .. và sử dụng mẹo của bạn ... –

+0

Tôi có vấn đề khác bây giờ .. làm thế nào tôi có thể vượt qua mã này để một inlineformset_factory? –

31

Đối với sự giúp đỡ của những người khác Google để ở đây: lỗi xuất phát từ init nhặt đối số từ cả một đối số vị trí và đối số mặc định. Daniel Roseman là chính xác cho câu hỏi như được hỏi.

này có thể là:

  1. Bạn đặt các tham số của vị trí và sau đó theo từ khóa:

    class C(): 
        def __init__(self, arg): ... 
    
    x = C(1, arg=2) # you passed arg twice! 
    
  2. Bạn đã quên đặt self như là đối số đầu tiên:

    class C(): 
        def __init__(arg): ... 
    
    x = C(arg=1) # but a position argument (for self) is automatically 
           # added by __new__()! 
    
0

Tôi nghĩ rằng đây là trường hợp với ModelForm, nhưng cần phải kiểm tra. Đối với tôi, giải pháp là:

def __init__(self, *args, **kwargs): 
    self.vUserProfile = kwargs.get('vUserProfile', None) 
    del kwargs['vUserProfile'] 
    super(ClienteForm, self).__init__(*args, **kwargs) 
    self.fields["idcidade"].queryset = Cidade.objects.using(self.vUserProfile.dbname).all()