【问题标题】:How to see if username already exists in UserCreationField - Django如何查看用户名是否已存在于 UserCreationField - Django
【发布时间】:2021-06-05 17:20:41
【问题描述】:

我正在 Django 中为我的网站创建一个简单的注册字段。我想查看用户名是否已经存在,如果存在则显示错误。例如,如果我有一个用户名为 hi 的帐户,而另一个用户在单击提交按钮后尝试创建一个用户名为 hi 的帐户,我想提出一个错误。现在,如果我要使用已经存在的用户名创建一个帐户,Django 将不会创建该帐户但不会显示错误。我的代码在下面。

Views.py

def index(request,*args, **kwargs):
  return render(request, "index.html", {} )

def register(request, ):
  form = CreateUserForm()
  if request.method == "POST":
    form = CreateUserForm(request.POST)
    if form.is_valid():
      form.save()
      username = form.cleaned_data.get('username')
      messages.success(request, f'Your account has been successfully created, {username} ')
      return redirect('login')


    

  context = {'form': form}
  return render(request, "register.html",  context )


def login(request,):
  return render(request,"login.html")

Forms.py

class CreateUserForm(UserCreationForm):
  username = forms.CharField(required=True, max_length=30, ) 
  email = forms.EmailField(required=True)
  first_name = forms.CharField(required=True, max_length=50)
  last_name = forms.CharField(required=True, max_length=50)
  class Meta:
    model = User
    fields = ['username', 'email', 'first_name', 'last_name', 'password1', 'password2',]
    

我不知道你是否需要这个,但这是我的 register.html:

<!--Might need to inherit from base.html-->
{% load crispy_forms_tags %}

{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:400,700">
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css">
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css">
<link rel="stylesheet" href="{% static "registerstyles.css" %}">
<title>GoodDeed - Register</title>
<script src="https://code.jquery.com/jquery-3.5.1.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/js/bootstrap.min.js"></script> 
</head>
<body>
<div class="signup-form" style=" position:absolute; top: -1.5%; left: 38%;">
    <form action="" method="post">
        <h2 style=>Sign Up</h2>
        <p style="font-size: xx-small; color: #f2f2f2;">---</p>
        
        {% csrf_token %} 
        {{form|crispy}}
        
            <button type="submit" class="btn btn-primary btn-lg">Sign Up</button>
            <a href="/login" style="position: absolute; top: 90%; left: 50%; font-size: 16px !important;">Already a user? Sign in!</a>


            
        

        </div>
    </form>

    <!--Sidebar bellow-->
    
</body>

</html>

感谢所有提供帮助的人!

***编辑

新的 Forms.PY 代码***

class CreateUserForm(UserCreationForm):
  username = forms.CharField(required=True, max_length=30, ) 
  email = forms.EmailField(required=True)
  first_name = forms.CharField(required=True, max_length=50)
  last_name = forms.CharField(required=True, max_length=50)

  
  class Meta:
    model = User
    fields = ['username', 'email', 'first_name', 'last_name', 'password1', 'password2',]



  def clean(self):
    cleaned_data=super.clean()
    if User.objects.filter(username=cleaned_data["username"].exists():
      raise ValidationError("The username is taken, please try another one")
  

【问题讨论】:

  • 您有自定义用户模型吗?如果这是来自 auth 的默认用户模型,则模型表单应该验证用户的唯一性。 {{form|crispy}} 应该为其呈现错误。
  • Crispy forms 呈现错误,但呈现非格式化文本错误。如果用户名已经存在,我想提出一个错误。
  • 啊,这是stackoverflow.com/questions/67850935/…的复制品,你们为什么要这样做?请只问一个问题一次。重复我对前一个用户所说的话,你期望的验证弹出类型不是由 Django 完成的,这是由 browsers 完成的默认验证,如果你想要这样的弹出窗口,你需要使用 JavaScript(也有一些 CSS),因此最好朝那个方向研究。
  • 好吧,我将其标记为重复,因为它是相同的问题,而您的代码完全相同。这显然不是一个巧合(请不要做这样的事情)并且有两个问题问同样的事情显然是违反直觉的。

标签: python html css django


【解决方案1】:

在您的表单中实现clean 函数,如in the documentation 所示

class CreateUserForm(UserCreationForm):
     .....
     def clean(self):
          cleaned_data=super().clean()
          if User.objects.filter(username=cleaned_data["username"].exists():
               raise ValidationError("The username is taken, please try another one")

【讨论】:

  • 我不太明白你实现一个干净的功能是什么意思。你能告诉我程序中的 clean 函数吗?
  • 谢谢,但还是不行。我在 forms.py 中的第 24 行代码末尾收到语法错误。我将用我的新代码更新我的问题,这似乎很容易解决。
  • 我已经用代码更新了我的问题。
  • 你能看一下吗?
  • super().clean()
猜你喜欢
  • 2015-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-08
  • 2017-06-07
  • 1970-01-01
  • 2021-02-11
  • 2019-05-24
相关资源
最近更新 更多