1. ホーム
  2. python

[解決済み] __init__() が予期しないキーワード引数 'user' を受け取りました。

2022-01-31 12:36:45

質問

私は Django を使って、ユーザと、ユーザが作成されたときのオブジェクトを作成しています。しかし、エラーが発生します

__init__() got an unexpected keyword argument 'user'

を呼び出すと 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)

この問題を検索して、いくつかのケースを見つけましたが、まだ解き方がわかりません。

どのように解決するのですか?

を行うことはできません。

LivingRoom.objects.create(user=instance)

を持っているからです。 __init__ を取らないメソッドです。 user を引数として与えます。

のようなものが必要です。

#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

更新情報

しかし ブルーノ もう言った , Djangoの models.Model サブクラスのイニシャライザはそのままにしておくか、あるいは *args**kwargs はモデルのメタフィールドにマッチします。

ですから、より良い原則に従って、おそらく次のようなものを用意する必要があります。

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

    def __init__(self, *args, temp=65, **kwargs):
        self.temp = temp
        return super().__init__(*args, **kwargs)

注 - もし、あなたが temp をキーワード引数として、例えば LivingRoom(65) ということになれば、そのようにするようになる。 LivingRoom(user=instance, temp=66) または、デフォルト(65)にしたい場合は、単に LivingRoom(user=instance) を使えばいいのです。