web-dev-qa-db-de.com

__init __ () hat ein unerwartetes Keyword-Argument "user" erhalten

ich benutze Django, um einen Benutzer und ein Objekt zu erstellen, wenn der Benutzer erstellt wird. Es liegt aber ein Fehler vor

__init__() got an unexpected keyword argument 'user'

beim Aufruf der Funktion register() in view.py. Die Funktion ist:

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

und die Objektklasse ist:

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)

Die Django-Fehlerseite benachrichtigt die Fehlerinformationen: user=User.objects.create_user(username, email, password) und LivingRoom.objects.create(user=instance)

Ich habe versucht, dieses Problem zu suchen und habe einige Fälle gefunden, kann aber immer noch nicht herausfinden, wie ich es lösen kann.

17
noben

Das kannst du nicht tun

LivingRoom.objects.create(user=instance)

weil Sie eine init-Methode haben, die user NICHT als Argument akzeptiert.

Du willst so etwas

#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
8
shad0w_wa1k3r

Ich habe den gleichen Fehler bekommen.

Aus meiner Sicht habe ich get_form_kwargs () folgendermaßen überschrieben:

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

In meinem Formular konnte ich jedoch die init () - Methode nicht überschreiben. Einmal habe ich es getan. Problem gelöst

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

LivingRoom.objects.create() ruft LivingRoom.__init__() auf - wie Sie vielleicht schon bemerkt haben, wenn Sie den Traceback gelesen haben - und dabei dieselben Argumente übergeben. Um es kurz zu machen: Der Initialisierer einer Django models.Model-Unterklasse sollte am besten in Ruhe gelassen werden oder sollte * args und ** kwargs akzeptieren, die den Metafeldern des Modells entsprechen. Die richtige Methode zum Bereitstellen von Standardwerten für Felder ist im Feldkonstruktor zu finden, der das Schlüsselwort default verwendet, wie in FineManual erläutert.

2

Überprüfen Sie Ihre Importe. Möglicherweise gibt es zwei Klassen mit demselben Namen. Entweder aus Ihrem Code oder aus einer Bibliothek, die Sie verwenden. Das war persönlich das Problem.

0
Kigenyi Phillip