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