#python #html #django
Вопрос:
Я Создаю Форму Входа И Регистрации В Django. Я получил ошибку create() takes 1 positional argument but 5 were given
.
код:
def register(request):
if request.method=="POST":
username=request.POST['username']
name=request.POST['name']
email=request.POST['email']
password=request.POST['password']
user_create = User.objects.create(username,name,email,password)
user_create.save()
messages.success(request, " Your account has been successfully created")
return redirect("/")
else:
return HttpResponse("404 - Not found")
HTML
Ответ №1:
Попробуй это:
def register(request):
if request.method=="POST":
username=request.POST['username']
name=request.POST['name']
email=request.POST['email']
password=request.POST['password']
instance, created = User.objects.update_or_create(
username=username,
defaults={'username': username, 'name': name, 'email': email, 'password': password},
)
if created:
messages.success(request, " Your account has been successfully created")
else:
messages.success(request, " Your account has been successfully updated")
return redirect("/")
else:
return HttpResponse("404 - Not found")
Объяснение:
Как вы столкнетесь UNIQUE constraint failed: auth_user.username
с проблемой, так update_or_create
и решим вашу проблему. Он обновит данные, если найдется какой-либо существующий, он создаст его.
Если Пользователь существует
username=username
, обновите значения по умолчанию, в противном случае создайте нового пользователя со значениями по умолчанию
Комментарии:
1. Но не сделает ли это учетную запись чувствительной к «угону». Если у человека А есть учетная запись. Человек B может использовать имя пользователя и, таким образом, притвориться, что создал учетную запись. В результате учетные данные теперь принадлежат уже не лицу А , а лицу В , и, таким образом, лицо В может иметь доступ ко всем данным лица А.
2. да, ваша проблема актуальна. мы можем использовать django по умолчанию
create_user
Ответ №2:
Вы должны работать с .create_user(…)
[Django-doc] и работать с именованными параметрами, а не с позиционными:
user_create = User.objects.create_user(
username=username,
first_name=name,
email=email,
password=password
)
.create_user(…)
Функция будет хэшировать пароль таким образом, чтобы пользователь мог быть должным образом аутентифицирован.
Хотя первые три параметра являются username
, email
password
и, таким образом, вы можете передать их в качестве позиционного параметра, я бы не советовал этого делать, поскольку явное лучше, чем неявное (часть Дзен Python).
Так .create_user(…)
как будет сохранен объект в базе данных, вам не придется .save()
user_create
:
def register(request):
if request.method == 'POST':
username=request.POST['username']
name=request.POST['name']
email=request.POST['email']
password=request.POST['password']
User.objects.create_user(
username=username,
first_name=name,
email=email,
password=password
)
messages.success(request, 'Your account has been successfully created')
return redirect('/')
else:
return HttpResponse('404 - Not found', status=404)