#django
#django
Вопрос:
Я пытаюсь зарегистрировать пользователей с помощью AbstractUser, но я получаю сообщение об ошибке. Хотя я получаю сообщение об ошибке, пользователи все равно регистрируются, но я не могу выполнить вход с зарегистрированными пользователями.
Ошибка выглядит так: ошибка выглядит так:
Мой views.py идет таким образом:
def signup(request):
if request.method == 'POST':
first_name = request.POST['first-name']
last_name = request.POST['last-name']
username = request.POST['username']
email = request.POST['email']
phone_no = request.POST['phone-no']
password = request.POST['password']
password2 = request.POST['password2']
if password==password2:
if CustomUser.objects.filter(username=username).exists():
messages.info(request, 'Username Taken')
return redirect('signup')
elif CustomUser.objects.filter(email=email).exists():
messages.info(request, 'Email Already Exist')
return redirect('signup')
else:
CustomUser.objects.create_user(first_name=first_name, last_name=last_name, username=username, email=email, phone_no=phone_no, password=password)
CustomUser.save(commit=False)
return redirect('login')
else:
messages.info(request, 'Passwords Not Matching')
return redirect('signup')
else:
return render(request, 'signup.html')
И мой models.py:
class CustomUser(AbstractUser):
id = models.AutoField(primary_key=True)
first_name = models.CharField(max_length=100)
last_name = models.CharField(max_length=100)
username = models.CharField(max_length=100, unique=True)
email = models.EmailField(unique=True)
password = models.CharField(max_length=150)
phone_no = models.CharField(max_length=20)
is_end_user = models.BooleanField(default=True)
is_smart_earner = models.BooleanField(default=False)
is_top_user = models.BooleanField(default=False)
Комментарии:
1. Удалите
CustomUser.save(commit=False)
. Это не имеет смысла, запись создается сcreate_user(...)
помощью метода, и вы можете.save()
моделировать только объекты . Кроме.save()
того, не принимаетcommit=...
параметр.
Ответ №1:
Удалите CustomUser.save(commit=False)
. Это не имеет смысла, запись создается с помощью .create_user(…)
метода [Django-doc].
Вы можете вызывать .save(…)
метод [Django-doc] только для объектов модели, поскольку они представляют запись в соответствующей таблице. Использование его в CustomUser
классе не имеет особого смысла, поскольку оно представляет таблицу, а сама таблица не изменяется при создании записи.
Кроме того, ваш .save()
вызов использует параметр commit=…
, но это тоже не имеет особого смысла: параметр .save(…)
a ModelForm
может принимать commit=…
параметр, а не тот, который для a Model
.
Однако я бы посоветовал работать с a ModelForm
. Это ModelForm
может автоматически проверять уникальные поля и сохранять созданного пользователя. У Django уже есть базовый ModelForm
для этого: UserCreationForm
[Django-doc] . С некоторыми небольшими изменениями он, вероятно, может работать для вашей пользовательской модели пользователя.