提问人:ayisha 提问时间:5/17/2023 最后编辑:ayisha 更新时间:5/25/2023 访问量:97
ValueError:必须设置给定的用户名
ValueError : The given username must be set
问:
''我正在尝试在python django中做一个注册表单,如果我们在不提供用户名的情况下点击提交,那么这个错误就会显示(当用户名字段有空值时).我想在提交之前检查用户名是否为无。
register.py
报名表格
<label><b>Username</b></label>
<input type="text" name="username" placeholder="Enter Username" ><br>
<label><b>Password</b></label>
<input type="password" name="password" placeholder="Enter Password" ><br>
<label><b>Confirm Password</b></label>
<input type="password" name="password1" placeholder="Confirm Your Password"><br>
<div class="col-md-12" style="text-align:center;padding-top:25px;">
<button type="submit">Submit</button>
views.py
def register(请求):
if request.method=='POST':
username = request.POST['username']
password = request.POST['password']
cpassword = request.POST['password1']
if password == cpassword:
if User.objects.filter(username=username).exists():
messages.info(request, "Username already exist")
return redirect('register')
else:
user=User.objects.create_user(username=username,password=password)
user.save();
return redirect('login')
else:
messages.info(request,"password not matching")
return redirect('register')
return redirect('/')
return render(request,"")`
答:
0赞
Sone Gillis
5/17/2023
#1
首先,我想强调您现有的代码片段的以下问题
- 表单中缺少 csrf 令牌 - Django 安全中间件不允许此 url 发出 POST 请求
- 仅依赖后端验证 - 虽然非常重要,但如果在前端进行预验证,只需向输入添加所需的属性和一些 JS 来检查密码匹配,就可以节省带宽
- 无需将用户重定向到注册页面 - 只需在表单中填写一些验证错误(如果有)并返回已填写的表单即可
- django 对象管理器中的方法在内部调用该方法,因此无需重复。
create_user
User
save
我有一些片段我会建议。当然,它是如此基本,但据我所知,应该回答您的问题
注册.html
<form method="post">
<ul>
{% for error_message in form_error_messages %}
<li style="color: red">{{error_message}}</li>
{% endfor %}
<ul>
{% csrf_token %}
<b>Username</b>
<input required type="text" name="username" placeholder="Username" value="{{username}}" /><br />
<br />
<b>Password</b>
<input required type="password" name="password" placeholder="Password" /><br />
<br />
<label><b>Confirm Password</b></label>
<input
type="password"
name="confirm_password"
placeholder="Confirm Your Password"
/><br />
<div style="padding-top: 25px">
<button type="submit">Submit</button>
</div>
</form>
views.py
from django.shortcuts import render, redirect
from django.contrib.auth.models import User
def register(request):
form_error_messages = []
username = ""
if request.method == "POST":
username = request.POST["username"]
password = request.POST["password"]
confirm_password = request.POST["confirm_password"]
if User.objects.filter(username=username).exists():
form_error_messages.append("User already exists!!")
if password != confirm_password:
form_error_messages.append("Passwords do not match!!")
if not all([username, password, confirm_password]):
form_error_messages.append("All fields are required!!")
if not len(form_error_messages):
User.objects.create_user(username=username,password=password)
return redirect('login')
return render(request, "my_auth/registration.html", {"form_error_messages": form_error_messages, "username": username})
说明:
将模型表单与内置的 django 一起使用将大大减少上面编写的大量批量代码,并且开箱即用的验证效果很好。本文将让您很好地掌握如何做到这一点UserCreationForm
评论
username = request.POST['username']
required