__init__() got an unexpected keyword argument 'user'

前端 未结 4 508
暗喜
暗喜 2020-12-25 12:14

i am using Django to create a user and an object when the user is created. But there is an error

__init__() got an unexpected keyword argument \'user\'<

相关标签:
4条回答
  • 2020-12-25 13:04

    You can't do

    LivingRoom.objects.create(user=instance)
    

    because you have an __init__ method that does NOT take user as argument.

    You need something like

    #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
    

    Update

    But, as bruno has already said it, Django's models.Model subclass's initializer is best left alone, or should accept *args and **kwargs matching the model's meta fields.

    So, following better principles, you should probably have something like

    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)
    

    Note - If you weren't using temp as a keyword argument, e.g. LivingRoom(65), then you'll have to start doing that. LivingRoom(user=instance, temp=66) or if you want the default (65), simply LivingRoom(user=instance) would do.

    0 讨论(0)
  • 2020-12-25 13:06

    Check your imports. There could be two classes with the same name. Either from your code or from a library you are using. Personally that was the issue.

    0 讨论(0)
  • 2020-12-25 13:13

    LivingRoom.objects.create() calls LivingRoom.__init__() - as you might have noticed if you had read the traceback - passing it the same arguments. To make a long story short, a Django models.Model subclass's initializer is best left alone, or should accept *args and **kwargs matching the model's meta fields. The correct way to provide default values for fields is in the field constructor using the default keyword as explained in the FineManual.

    0 讨论(0)
  • 2020-12-25 13:17

    I got the same error.

    On my view I was overriding get_form_kwargs() like this:

    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
    

    But on my form I failed to override the init() method. Once I did it. Problem solved

    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 讨论(0)
提交回复
热议问题