Как Исправить create() принимает 1 позиционный аргумент, но 5 были даны В python django

#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

https://paste.pythondiscord.com/amoturoqop.xml

Ответ №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)