Как решить проблему ValueError в /register в django
Я пытаюсь создать регистрацию с помощью Django, но после заполнения формы я продолжаю получать это ValueError в /register как ошибку, требующую, чтобы имя пользователя было установлено. Я новичок в Django и, похоже, не понимаю, что от меня требуется. Ниже приведены мои коды для формы регистрации, views.py и возникающая ошибка соответственно
Форма подписки:
{% for message in messages %}
<h5>{{message}}</h5>
{% endfor %}
<form method="POST" action="register" name="registerForm">
{% csrf_token %}
<p>Username:</p>
<input type="text" name="username "/>
<p>Email:</p>
<input type="email" name="email "/>
<p>Password:</p>
<input type="password" name="password"/>
<p>Repeat Password:</p>
<input type="password" name="confirm_password"/><br>
<input type="submit"/>
</form>
views.py
def register(request):
if request.method == 'POST':
username = request.POST.get('username')
email = request.POST.get('email')
password = request.POST.get('password')
confirm_password = request.POST.get('confirm_password')
if password==confirm_password:
if User.objects.filter(username=username).exists():
messages.info(request, 'Username Taken')
return redirect('register')
elif User.objects.filter(email=email).exists():
messages.info(request, 'Email Taken')
return redirect('register')
else:
user = User.objects.create_user(username=username, email=email, password=password)
user.save()
return redirect('/')
else:
messages.info(request, 'Password does not match')
return redirect('register')
else:
return render(request, 'register.html')
Ошибка:
ValueError at /register
Должно быть установлено заданное имя пользователя
Метод запроса: POST
URL запроса: http://127.0.0.1:8000/register.
Версия Django: 4.1.3
Тип исключения: ValueError
Значение исключения:
Данное имя пользователя должно быть установлено
Местоположение исключения: C:\Users\User\Envs\myapp\lib\site-packages\django\contrib\auth\models.py, line 144, in _create_user
Поднято во время: myapp.views.register
Python Executable: C:\Users\User\Envs\myapp\Scripts\python.exe
Версия Python: 3.10.4
Python Path:
['C:\Users\User\Desktop\Python_journey\djangoTut\myproject',
'C:\Users\User\AppData\Local\Programs\Python\Python310\python310.zip',
'C:\Users\User\AppData\Local\Programs\Python\Python310\DLLs',
'C:\Users\User\AppData\Local\Programs\Python\Python310\lib',
'C:\Users\User\AppData\Local\Programs\Python\Python310',
'C:\Users\User\Envs\myapp',
'C:\Users\User\Envs\myapp\lib\site-packages'].
Время сервера: Tue, 22 Nov 2022 07:17:35 +0000
Мне кажется, вы поступаете неправильно.
Изменить это:
action="register"
К этому:
action="{% url 'register' %}" #You need to write name of this register route.
ИЛИ
Просто вы можете попробовать этот способ:
action="/register/"
Проблема находится внутри вашего файла signup.html:
{% for message in messages %}
<h5>{{message}}</h5>
{% endfor %}
<form method="POST" action="/register/" name="registerForm">
{% csrf_token %}
<p>Username:</p>
<input type="text" name="username "/>
<!-- blank space in this input -->
<p>Email:</p>
<input type="email" name="email "/>
<!-- blank space in this input -->
<p>Password:</p>
<input type="password" name="password"/>
<p>Repeat Password:</p>
<input type="password" name="confirm_password"/><br>
<input type="submit"/>
</form>
Вы имеете пробелы внутри значения тега ввода "name". Поэтому эти значения не передаются вашему представлению внутри запроса, вместо них вы получаете значение None.
При попытке получить объект с этим значением возникает исключение.
User.objects.filter(username=username).exists()
Я хотел бы порекомендовать получать вашу модель с помощью try/except для обработки ошибок, или использовать ярлык Django get-object-or-404 перед проверкой ее существования.