首页 > 解决方案 > /register 处的 ValueError:必须设置给定的用户名

问题描述

ValueError at /register/ 必须设置给定的用户名 请求方法:POST 请求 URL: http: //127.0.0.1 :8000/register/ Django 版本:1.11.4 异常类型:ValueError 异常值:
必须设置给定的用户名

这是views.py

def register_page(request):
    form = RegisterForm(request.POST or None)
    context = {
        "form": form
    }
    if form.is_valid():
        print(form.cleaned_data)
        username = form.cleaned_data.get("username")
        email = form.cleaned_data.get("email")
        password = form.cleaned_data.get("password")
        user = User.objects.create_user(username,email,password)
        print(username)
    return render(request, "auth/register.html", context)

这是发送 None 作为用户名,我不知道为什么? user = User.objects.create_user(username,email,password) 如何解决这个问题?它没有通过 POST 方法获取用户名或有其他错误?

标签: pythondjangodjango-modelsdjango-formsdjango-views

解决方案


首先,即使您不在 POST 案例中,您也在做很多事情。我建议您检查您是否在 POST 中。

if request.method == 'POST':

如果您在 POST 中,您可以使用以下命令检索表单:

form = RegisterForm(request.POST)

如果您不在 POST 中,则必须向页面发送一个空表单:

form = RegisterForm()

然后,在检查表单是否有效后,您就可以创建新用户了。

user = User()

请注意,您必须导入类 User :from django.contrib.auth.models import User 现在您可以像以前一样从表单中检索数据,并将其分配给新的空用户:

user.username = form.cleaned_data.get('username')
user.email = form.cleaned_data.get('email')

对于密码,您应该使用以下命令对其进行加密:

user.password = make_password(form.cleaned_data.get('password'))

请注意,您必须导入 make_password 方法:from django.contrib.auth.hashers import make_password

毕竟,您可以将新用户保存到数据库中:

user.save()

请注意,如果多个用户尝试使用相同的用户名等注册,您可能应该将保存到一个try: ... except块中以捕获由 IntegrityError 引起的潜在异常,这取决于 Django 默认情况下用于其用户模型的完整性规则(我不记得了)

最后,您的视图应如下所示(或类似):

def register_page(request):
    if request.method == 'POST':
        form = RegisterForm(request.POST)
        if form.is_valid():
            user = User()
            user.username = form.cleaned_data.get('username')
            user.email = form.cleaned_data.get('email')
            user.password = make_password(form.cleaned_data.get('password'))
            user.save()
    else:
        form = RegisterForm()
    return render(request, 'auth/register.html', {'form': form})

考虑到您进行了导入、正确的 RegisterForm 和正确的 auth/register.html,它应该可以工作


推荐阅读