Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django方法exists()不工作,错误“赋值前引用”_Python_Django_Django Views - Fatal编程技术网

Python Django方法exists()不工作,错误“赋值前引用”

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":

经过很长时间的寻找解决方案,我没有前进的理由

我尝试让操作功能,如果存在:为用户的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":
        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随后将呈现带有错误的表单。我真的很抱歉打扰您这么多,删除重定向并不能真正解决问题,我最好在这里解释一下