Reputation: 91
I am trying to register users using their first name, last name, username, email and password. I see in the create_user in Django docs that first_name and last_name are included in the default fields of user model. However when I try to submit my register form, I get an error saying "create_user() takes from 2 to 4 positional arguments but 6 were given". What is wrong with my code?
Anyway this can be fixed without creating custom user model? How can I pass the first_name and last_name to create_user() ?
forms.py:
from django import forms
from django.contrib.auth import get_user_model
User = get_user_model()
class RegisterForm(forms.Form):
first_name = forms.CharField()
last_name = forms.CharField()
username = forms.CharField()
email = forms.EmailField()
password = forms.CharField(widget=forms.PasswordInput)
password2 = forms.CharField(label='Confirm password', widget=forms.PasswordInput)
def clean_username(self):
username = self.cleaned_data.get('username')
qs = User.objects.filter(username=username)
if qs.exists():
raise forms.ValidationError("Username is taken")
return username
def clean_email(self):
email = self.cleaned_data.get('email')
qs = User.objects.filter(email=email)
if qs.exists():
raise forms.ValidationError("email is taken")
return email
def clean(self):
data = self.cleaned_data
password = self.cleaned_data.get('password')
password2 = self.cleaned_data.get('password2')
if password2 != password:
raise forms.ValidationError("Passwords must match.")
return data
views.py:
from django.contrib.auth import authenticate, login, get_user_model
from django.http import HttpResponse
from django.shortcuts import render, redirect
from .forms import LoginForm, RegisterForm
User = get_user_model()
def register_page(request):
register_form = RegisterForm(request.POST or None)
context = {
"register_form": register_form
}
if register_form.is_valid():
username = register_form.cleaned_data.get("username")
first_name = register_form.cleaned_data.get("first_name")
last_name = register_form.cleaned_data.get("last_name")
email = register_form.cleaned_data.get("email")
password = register_form.cleaned_data.get("password")
new_user = User.objects.create_user(username, email, password, first_name, last_name)
return render(request, "auth/register.html", context)
Upvotes: 1
Views: 7145
Reputation: 142
create_user(username, email=None, password=None, **extra_fields)
The **extra_fields
ar keyword argument means you should pass them as first_name=first_name
Read this, it may help: https://docs.djangoproject.com/en/2.1/ref/contrib/auth/#django.contrib.auth.models.User
Upvotes: 1
Reputation: 13731
You need to pass them in as keyword arguments so that it has a name for the field to go with the value.
new_user = User.objects.create_user(
username, email, password,
first_name=first_name,
last_name=last_name,
)
Upvotes: 5