2013-11-14 15 views
10

tôi đang sử dụng Django để tạo người dùng và đối tượng khi người dùng được tạo. Nhưng có một lỗi__init __() nhận được đối số từ khóa không mong muốn 'người dùng'

__init__() got an unexpected keyword argument 'user'

khi gọi các hàm trong register() view.py. Chức năng là:

def register(request): 
    '''signup view'''  
    if request.method=="POST": 
     form=RegisterForm(request.POST) 
     if form.is_valid(): 
      username=form.cleaned_data["username"] 
      email=form.cleaned_data["email"] 
      password=form.cleaned_data["password"] 
      user=User.objects.create_user(username, email, password) 
      user.save() 
      return HttpResponseRedirect('/keenhome/accounts/login/') 
     else: 
      form = RegisterForm()  
      return render_to_response("polls/register.html", {'form':form}, context_instance=RequestContext(request)) 

    #This is used for reinputting if failed to register  
    else: 
     form = RegisterForm()  
     return render_to_response("polls/register.html", {'form':form}, context_instance=RequestContext(request)) 

và lớp đối tượng là:

class LivingRoom(models.Model): 
    '''Living Room object''' 
    user = models.OneToOneField(User) 

    def __init__(self, temp=65): 
     self.temp=temp 

    TURN_ON_OFF = (
     ('ON', 'On'), 
     ('OFF', 'Off'), 
    ) 

    TEMP = (
     ('HIGH', 'High'), 
     ('MEDIUM', 'Medium'), 
     ('LOW', 'Low'), 
    ) 

    on_off = models.CharField(max_length=2, choices=TURN_ON_OFF) 
    temp = models.CharField(max_length=2, choices=TEMP) 

#signal function: if a user is created, add control livingroom to the user  
def create_control_livingroom(sender, instance, created, **kwargs): 
    if created: 
     LivingRoom.objects.create(user=instance) 

post_save.connect(create_control_livingroom, sender=User) 

Các trang lỗi Django thông báo các thông tin báo lỗi: user=User.objects.create_user(username, email, password)LivingRoom.objects.create(user=instance)

tôi đã cố gắng để tìm kiếm vấn đề này , tìm một số trường hợp, nhưng vẫn không thể tìm ra cách giải quyết nó.

+0

Đoán của tôi là, không thành công ở đây: 'create_control_livingroom' bạn có thể tắt tín hiệu và thử không? và bạn có thể hiển thị stacktrace không? – karthikr

+0

Tại sao bạn giới hạn phương thức 'LivingRoom .__ init__' thành * chỉ *' temp' sau đó? –

Trả lời

5

Bạn không thể làm

LivingRoom.objects.create(user=instance) 

bởi vì bạn có một phương pháp init mà không mất user như là đối số.

Bạn muốn một cái gì đó giống như

#signal function: if a user is created, add control livingroom to the user  
def create_control_livingroom(sender, instance, created, **kwargs): 
    if created: 
     my_room = LivingRoom() 
     my_room.user = instance 
+0

Vâng, vấn đề là từ hàm '__init __()', nhưng tại sao hàm này 'KHÔNG dùng người dùng làm đối số'? – noben

+0

Bởi vì hàm "init" chỉ có 2 biến được chấp nhận 'def __init __ (self, temp = 65)', 'self' (thể hiện lớp) &' temp'. Ngoài ra, biến lớp "người dùng" không được xác định cho trường hợp đó. –

1

LivingRoom.objects.create() cuộc gọi LivingRoom.__init__() - như bạn có thể nhận thấy nếu bạn đã đọc traceback - đi qua nó lập luận tương tự. Để tạo ra một câu chuyện dài ngắn, bộ khởi tạo của lớp con Django models.Model là tốt nhất còn lại một mình, hoặc nên chấp nhận * args và ** kwargs khớp với các trường meta của mô hình. Cách chính xác để cung cấp giá trị mặc định cho trường là trong hàm tạo trường bằng cách sử dụng từ khóa default như được giải thích trong FineManual.

4

Tôi gặp lỗi tương tự.

Theo quan điểm của tôi, tôi đã được trọng get_form_kwargs() như thế này:

class UserAccountView(FormView): 
    form_class = UserAccountForm 
    success_url = '/' 
    template_name = 'user_account/user-account.html' 

def get_form_kwargs(self): 
    kwargs = super(UserAccountView, self).get_form_kwargs() 
    kwargs.update({'user': self.request.user}) 
    return kwargs 

Nhưng vào mẫu của tôi, tôi không thể ghi đè lên các phương pháp init(). Một khi tôi đã làm nó. Sự cố được giải quyết

class UserAccountForm(forms.Form): 
    first_name = forms.CharField(label='Your first name', max_length=30) 
    last_name = forms.CharField(label='Your last name', max_length=30) 
    email = forms.EmailField(max_length=75) 

    def __init__(self, *args, **kwargs): 
     user = kwargs.pop('user') 
     super(UserAccountForm, self).__init__(*args, **kwargs) 
+0

Phần '** kwargs' và' super() 'đã thực hiện thủ thuật cho tôi – n1000

Các vấn đề liên quan