我正在开发一个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)
谢谢。
答案 0 :(得分:27)
当ModelForms绑定到模型对象时,它们有一个名为'instance'的属性,它是模型对象本身。在您的视图中,当request.method == 'POST'
时,您可能正在创建这样的表单实例:
form = ChangeNameForm(request.POST, instance=request.user)
如果是这种情况,您可以从表单方法访问已记录的用户,您的验证方法可以是这样的:
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)
考虑使用.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
或者,您也可以在提出ValidationError时关注these guidelines。
我现在无法测试此代码,所以如果出现任何问题我会道歉。
答案 1 :(得分:0)
这就是我设法让它工作的方式(假设你有一个登录用户):
forms.py
from django.contrib.auth.forms import UserChangeForm
from django.contrib.auth.models import User
class MyUserChangeForm(UserChangeForm):
def __init__(self, *args, **kwargs):
super(MyUserChangeForm, self).__init__(*args, **kwargs)
del self.fields['password']
class Meta:
model = User
fields = ('username', 'first_name')
views.py
def home(request):
if request.method == 'POST':
form = MyUserChangeForm(request.POST, instance=request.user)
if form.is_valid():
form.save()
else:
form = MyUserChangeForm(instance=request.user)
return render(request, 'change_user.html', {"form": form})
答案 2 :(得分:0)
您可以编写函数来检查用户名是否存在,例如:
from django.contrib.auth.models import User
def username_exists(username):
if User.objects.filter(username=username).exists():
return True
return False