2013-11-14 16 views
10

私はDjangoを使用して、ユーザー作成時にユーザーとオブジェクトを作成しています。 view.py.でregister()関数を呼び出すときには、エラー__init __()は、予期しないキーワード引数 'user'を持っています

__init__() got an unexpected keyword argument 'user'

があります

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) 

Djangoのエラーページはエラー情報を通知しますいくつかのケースを見つけることができますが、それでも解決する方法を見つけることはできません。

+0

私の推測では、ここでは失敗しています: 'create_control_livingroom'あなたは信号をオフにして試すことができますか? stacktraceも表示できますか? – karthikr

+0

なぜ 'LivingRoom .__ init__'メソッドを* just *' temp'に制限しますか? –

答えて

5

あなたが引数としてuserとらないinitメソッドを持っているので、あなたは

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'(classインスタンス)、' temp'しか持たないためです。また、そのインスタンスのクラス変数 "user"はまだ定義されていません。 –

1

LivingRoom.objects.create()通話LivingRoom.__init__()ような何かをしたいです。長いストーリーを短くするには、Django models.Modelサブクラスのイニシャライザをそのまま残しておくか、モデルのメタフィールドに一致する* argsと** kwargsを受け入れることをお勧めします。フィールドのデフォルト値を提供する正しい方法は、FineManualで説明したdefaultキーワードを使用して、フィールドコンストラクタにあります。

4

同じエラーが発生しました。このような私の見解では

私は(get_form_kwargsをオーバーライドして):

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 

しかし、私のフォーム上で、私はのinit()メソッドをオーバーライドすることができませんでした。かつて私はそれをやった。問題が解決しました

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

関連する問題