ValueError:必须设置给定的用户名

ValueError : The given username must be set

提问人:ayisha 提问时间:5/17/2023 最后编辑:ayisha 更新时间:5/25/2023 访问量:97

问:

''我正在尝试在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,"")`
python html django

评论

0赞 Captain Caveman 5/17/2023
您可以在检查用户名是否在 POST 中之前添加条件语句。username = request.POST['username']
0赞 sudden_appearance 5/17/2023
只需将 prop 添加到用户名输入元素(我在共享片段中没有看到它)required
0赞 John Gordon 5/17/2023
该表单没有用户名输入元素...

答:

0赞 Sone Gillis 5/17/2023 #1

首先,我想强调您现有的代码片段的以下问题

  1. 表单中缺少 csrf 令牌 - Django 安全中间件不允许此 url 发出 POST 请求
  2. 仅依赖后端验证 - 虽然非常重要,但如果在前端进行预验证,只需向输入添加所需的属性和一些 JS 来检查密码匹配,就可以节省带宽
  3. 无需将用户重定向到注册页面 - 只需在表单中填写一些验证错误(如果有)并返回已填写的表单即可
  4. django 对象管理器中的方法在内部调用该方法,因此无需重复。create_userUsersave

我有一些片段我会建议。当然,它是如此基本,但据我所知,应该回答您的问题

注册.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