2013-11-14 5 views
10

사용자 생성시 Django를 사용하여 객체를 생성하고 있습니다. 그러나 오류를가__init __() 예상치 못한 키워드 인자 'user'가 있습니다.

__init__() got an unexpected keyword argument 'user'

view.py.에서 register() 함수를 호출

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

와 객체 클래스는 다음과 같습니다 : 기능은 user=User.objects.create_user(username, email, password)LivingRoom.objects.create(user=instance)

내가이 문제를 검색하려고 :

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) 

장고 오류 페이지가 오류 정보를 통지 몇 가지 사례를 찾아 낼 수는 있지만 여전히 해결 방법을 찾을 수는 없습니다. 이 인수로 user을하지 않는 init 메소드를 가지고 있기 때문에

+0

내 생각에, 여기에 실패했습니다. 'create_control_livingroom' 신호를 끄고 시도 할 수 있습니까? stacktrace도 표시 할 수 있습니까? – karthikr

+0

왜 LivingRoom .__ init__ 메소드를 * just *'temp'로 제한합니까? –

답변

5

당신은

LivingRoom.objects.create(user=instance) 

할 수 없습니다. 같은 인수를 전달 - 당신은 역 추적을 읽은 경우에 당신이 눈치 챘을 수도로 -

당신은

#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

그래, 문제는'__init __()'함수에서 왔지만, 왜이 함수는'사용자를 인수로 사용하지 않습니까? ' – noben

+0

"init"함수는 2 개의 허용 가능한 변수'def __init __ (self, temp = 65)','self' (클래스 인스턴스) 및'temp'만을 가지고 있기 때문에. 또한 클래스 변수 "user"는 해당 인스턴스에 대해 아직 정의되지 않았습니다. –

1

LivingRoom.objects.create() 전화 LivingRoom.__init__() 같은 것을 원한다. 긴 이야기를 짧게하기 위해, Django models.Model 서브 클래스의 초기화 프로그램을 사용하는 것이 가장 좋으며 모델의 메타 필드와 일치하는 * args 및 ** kwargs를 허용해야합니다. 필드의 기본값을 제공하는 올바른 방법은 FineManual에서 설명한대로 default 키워드를 사용하는 필드 생성자에 있습니다.

4

동일한 오류가 발생했습니다.

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 

을하지만 내 양식에 나는 초기화() 메소드를 오버라이드 (override)하지 못했습니다 : 내보기에

나는 이런 식으로() get_form_kwargs을 무시했다. 일단 내가 해냈어. 문제가 해결되었습니다.

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

'** kwargs'와'super()'부분이 나에게 트릭을 보냈습니다. – n1000

관련 문제