检查Django中是否存在用户名

luk*_*kas 14 django django-models django-forms

我正在开发一个Django项目,用户可以在一个表单中更改他们的用户名以及他们的名字和姓氏.在forms.py中,我试图找出用户是否存在.如果是这样,它应该显示错误.问题是如果用户想要更改他的名字和姓氏并在输入中留下他的用户名,则会引发验证错误.显然,该用户名已经存在.有没有办法检查它是否等于当前登录用户的用户名并避免显示错误?

class ChangeNameForm(forms.ModelForm):
    username = forms.CharField(max_length=30)
    first_name = forms.CharField(max_length=255)
    last_name = forms.CharField(max_length=255)

    def clean_username(self):
        username = self.cleaned_data['username']

        try:
            user = User.objects.get(username=username)
        except user.DoesNotExist:
            return username
        raise forms.ValidationError(u'Username "%s" is already in use.' % username)
Run Code Online (Sandbox Code Playgroud)

谢谢.

Vic*_*lva 27

当ModelForms绑定到模型对象时,它们有一个名为"instance"的属性,它是模型对象本身.在您的视图中,request.method == 'POST'您可能正在创建这样的表单实例:

form = ChangeNameForm(request.POST, instance=request.user)
Run Code Online (Sandbox Code Playgroud)

如果是这种情况,您可以从表单方法访问已记录的用户,您的验证方法可以是这样的:

def clean_username(self):
    username = self.cleaned_data['username']
    try:
        user = User.objects.exclude(pk=self.instance.pk).get(username=username)
    except User.DoesNotExist:
        return username
    raise forms.ValidationError(u'Username "%s" is already in use.' % username)
Run Code Online (Sandbox Code Playgroud)

考虑使用.exists方法,因为它会向您的数据库发出比您尝试使用.get方法检索所有用户信息更快的查询.而且代码也变得更清晰了:

def clean_username(self):
    username = self.cleaned_data['username']
    if User.objects.exclude(pk=self.instance.pk).filter(username=username).exists():
        raise forms.ValidationError(u'Username "%s" is already in use.' % username)
    return username
Run Code Online (Sandbox Code Playgroud)

(可选)您还可以在引发ValidationError时遵循这些准则.

我现在无法测试此代码,所以如果出现任何问题我会道歉.

  • 嘿嘿@lukas 也可以做`if User.objects.filter(username=username).count()` (3认同)

All*_*Sun 8

您可以编写函数来检查用户名是否存在,如下所示:

@ggorlen,谢谢!更新:

from django.contrib.auth.models import User

def username_exists(username):
    return User.objects.filter(username=username).exists()
Run Code Online (Sandbox Code Playgroud)
from django.contrib.auth.models import User

def username_exists(username):
    if User.objects.filter(username=username).exists():
        return True
    
    return False
Run Code Online (Sandbox Code Playgroud)

  • `return User.objects.filter(username=username).exists()` 似乎更直接。`.exists()` 已经返回一个布尔值,因此用 `if` 包装它并添加 `True` 和 `False` 文字只会增加更多的间接性和不必要的冗长。 (2认同)