Python Django方法exists()不工作,错误“赋值前引用”
经过很长时间的寻找解决方案,我没有前进的理由 我尝试让操作功能,如果存在:为用户的User.username,因此避免重复的用户名在我的网站,但这是不工作的 这是我在views.py中的代码:Python Django方法exists()不工作,错误“赋值前引用”,python,django,django-views,Python,Django,Django Views,经过很长时间的寻找解决方案,我没有前进的理由 我尝试让操作功能,如果存在:为用户的User.username,因此避免重复的用户名在我的网站,但这是不工作的 这是我在views.py中的代码: def edit_profil(request, pk=id): error_name = reverse_lazy('profil_edit') template_name="blog/edit_profil.html" if request.method == "POST":
def edit_profil(request, pk=id):
error_name = reverse_lazy('profil_edit')
template_name="blog/edit_profil.html"
if request.method == "POST":
form = EditProfilForm(data=request.POST, instance=request.user)
if form.is_valid():
usernameDatas = form.cleaned_data['username']
if User.objects.filter(username=usernameDatas).exists():
messages.error(request, 'This is Username already exists !')
return redirect(error_name)
else:
user = form.save(commit=False)
user.email = form.cleaned_data['email']
user.username=usernameDatas
user.save()
return redirect('/blog/profil')
else:
form = EditProfilForm(instance=request.user)
return render(request, template_name, locals())
收到的错误是:
赋值前引用的局部变量“usernameDatas”
我的错误在哪里?谢谢大家。存在并不是问题的根源。这是Python中相当普遍的错误。这意味着您在为变量赋值之前先使用它。现在在.exists行中,只使用了一个局部变量:usernameDatas。因此,很可能该变量未赋值
如果我们现在看一看它无效的可能场景,我们会发现如果form.is_valid失败并返回False,就会发生这种情况。处理此问题最直接的方法是通过内联零件:
def edit_profil(request, pk=id):
error_name = reverse_lazy('profil_edit')
template_name="blog/edit_profil.html"
if request.method == "POST":
form = EditProfilForm(data=request.POST, instance=request.user)
if form.is_valid():
usernameDatas = form.cleaned_data['username']
# inline relevant parts
if User.objects.filter(username=usernameDatas).exists():
messages.error(request, 'This is Username already exists !')
return redirect(error_name)
else:
user = form.save(commit=False)
user.email = form.cleaned_data['email']
user.username=usernameDatas
user.save()
return redirect('/blog/profil')
else:
form = EditProfilForm(instance=request.user)
return render(request, template_name, locals())
然而,请注意,上述方法是解决此问题的一种优雅方法。如果为相关Django模型的username字段指定unique=True,则表单将自动验证该字段。此外,还可以在redirct中指定路径。。而不是视图的名称,这使得它对URL更改很敏感。最后,使用局部变量是一种严重的反模式:最好传递一个包含所用变量的字典。错误与.exists本身无关。表单完全无效,因此不会分配usernameDatas。您可能希望将代码内联到if主体中。您的表单无效,因此python不会进入if子句中…非常感谢,我删除了函数局部变量,谢谢。我在重定向中指定路径。。正如在docs dango http/shortcuts/redirect中一样,我已经理解了我的错误,但您的代码不起作用:例如,当我与现有用户更改我的名称时,作为一个衬里的名称看起来好像是保存而未保存的,非常奇怪的“-”。还有我的留言。错误不起作用,但暂时不重要。对于use unique=True,我使用django的用户模型,它的功能是因为它没有保存双用户名,但没有返回通知用户的消息错误,但是如果用户使用此名称存在,那么-假设我正确理解您的消息-不应该保存它,因为您使用相同的用户名创建了一个新用户。因此useername应该是新的唯一的。是的,用户必须是唯一的,默认情况下该功能可以工作,因为我使用的是user model=>django.contrib.auth.models,我正在尝试使用if exist配置代码:当用户输入一个已经存在的用户名时,可能会向用户返回一条错误消息。我没有用户名,这很难看。您的代码避免了我在第一条主题消息中出现的错误,但正如我前面所说的,您的代码有一个非常奇怪的操作,它不会返回我的消息。错误并复制已存在的用户名,但不保存。@Ninja0x:会,但由于您重定向,您会刷新页面。如果指定该字段在模型中是唯一的,则表单本身将出错。我将删除重定向..,从而返回带有表单的呈现页面。Django随后将呈现带有错误的表单。我真的很抱歉打扰您这么多,删除重定向并不能真正解决问题,我最好在这里解释一下