2013-11-14 43 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)) 

和对象类是:

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的错误页面通知错误信息: user=User.objects.create_user(username, email, password)LivingRoom.objects.create(user=instance)

我试图寻找这个问题,找到一些案例,但仍然无法弄清楚如何解决它。

+0

我的猜测是,它在这里失败:'create_control_livingroom'你可以关掉信号并试试吗?你也可以显示堆栈跟踪吗? – karthikr

+0

那么为什么你将'LivingRoom .__ init__'方法限制为*只是*'temp'呢? –

回答

5

你不能这样做

LivingRoom.objects.create(user=instance) 

因为你不采取user作为参数的init方法。

你想要的东西像

#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”只有两个可接受的变量'def __init __(self,temp = 65)','self'(class instance)&'temp'。此外,尚未为该实例定义类变量“用户”。 –

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

相关问题