首页 > 解决方案 > 在 django 中创建注册视图,总是出现完整性错误

问题描述

所以这是我为视图编写的函数:

def register(request):
    if request.method == "POST":
        username = request.POST["username"]
        email = request.POST["email"]
        year = request.POST["Year"]
        form = registerForm(request.POST)
        if form.is_valid():
            branch = form.cleaned_data['branch']
        else:
            return render(request, "events/register.html", {
                "message": "You didn't provide all the fields",
                "form": registerForm()
            })
        if not email.endswith("ac.in"):
            return render(request, "events/register.html", {
                "message": "You must have an institution account",
                "form": registerForm()
            })

        # Ensure password matches confirmation
        password = request.POST["password"]
        confirmation = request.POST["confirmation"]
        if password != confirmation:
            return render(request, "events/register.html", {
                "message": "Passwords must match.",
                "form": registerForm()
            })

        try:
            name = User.objects.get(email=email)
        except ObjectDoesNotExist :
            name = None

        # Attempt to create new user
        #Now This is where the problem is
        if name is None:
            user = User.objects.create(username=username, email=email, password=password,     year=year, branch=branch)
            user.save()
        else:
            return render(request, "events/register.html", {
                "message": "email already taken.",
                "form": registerForm()
            })
        login(request, user)
        return HttpResponseRedirect(reverse("events:index"))
    else:
        ctx = { "form": registerForm() }
        return render(request, "events/register.html", ctx)

因此,当提交表单时,我首先检查具有输入用户名的对象是否已经存在,如果确实存在,则返回带有消息的表单(已发送电子邮件)。但是每次我尝试创建新用户时,都会返回此消息,并且我无法创建用户对象。这里出了什么问题?

标签: djangodjango-modelsdjango-forms

解决方案


@musical_ant - 首先,你的观点非常臃肿,有很多逻辑。视图中有很多业务逻辑正在进行,它们应该提供一个简单的功能 - “注册用户”。有什么可以改进的——

  1. 密码确认匹配应在客户端完成。当使用一些简单的客户端 Js 可以轻松完成时,为什么要在后端进行如此简单的操作?

  2. 您通过访问请求有效负载和表单中的一些数据来获取一些数据。这是为什么?如果您正在渲染某种 Django 表单或 ModelForm,为什么不使用 clean_data 来获取所有值。或者如果你想通过 request.POST 因为一些 ajax 调用然后使用它......你为什么混合所有这些?

    if form.is_valid():
      branch = form.cleaned_data['branch']
    

这条线对我来说毫无意义。如果表单有效,您将提取一个值。理想情况下,如果一个表单是有效的,我们称之为表单。节省()。如果它无效,我们检查 form.errors() 3。

name = User.objects.get(email=email)

我的问题是你正在检查用户表中是否存在电子邮件,如果用户输入的用户名也存在于用户表中,如果我没有错,用户名应该是唯一的。如果用户名已经存在,那么这一行不会抛出错误

user = User.objects.create(username=username, email=email, password=password,year=year, branch=branch)
    user.save()

推荐阅读