Django - 检查对象是否存在

Use*_*696 1 django

我正在尝试检查我的表单中是否存在对象,但出现错误。

我的观点:

def foo(request):
    titulo = "something"
    form = MyForm(request.POST or None)
    queryset = myModel.objects.all()
    if myModel.objects.filter(name=name).exists():
        messages.error(request, 'already exists')
    context = {
        "titulo": titulo,
        "form": form,
        "queryset": queryset,
    }
    if form.is_valid():
        instance = form.save()
        messages.success(request, 'Added')
        return redirect('/')
    return render(request, "forms7.html", context)
Run Code Online (Sandbox Code Playgroud)

基本上我正在做的是添加一个用户,如果该用户存在我想要一个警告说already exists

错误:

分配之前引用的 /model/ 局部变量“名称”处出现 UnboundLocalError

我究竟做错了什么?

注意: 如果我添加name = 'jesus'到我的代码并jesus存在它可以工作,但这不是我想要的。

我想检查我输入的名称是否存在并向我显示消息

有人可以帮助我吗?谢谢。

2ps*_*2ps 5

is_valid使用表单时,您可以通过调用然后访问 来获取输入的表单字段cleaned_data,如下所示:

\n\n
def foo(request):\n    titulo = "something"\n    form = MyForm(request.POST or None)\n    queryset = myModel.objects.all()\n    context = {\n        "titulo": titulo,\n        "form": form,\n        "queryset": queryset,\n    }\n\n    if form.is_valid():\n        name = form.cleaned_data[\'name\']\n        if myModel.objects.filter(name=name).exists():\n            messages.error(request, \'already exists\')\n        else:                \n            instance = form.save()\n            messages.success(request, \'Added\')\n            return redirect(\'/\')\n    return render(request, "forms7.html", context)    \n
Run Code Online (Sandbox Code Playgroud)\n\n

理想情况下,您\xe2\x80\x99dclean_name在您的表单中有一个函数,以便您的视图不那么复杂。您可以在此处阅读有关创建此类方法的更多信息。

\n\n
\n

例如,如果您想验证名为serialnumber 的CharField 的内容是否唯一,clean_serialnumber() 将是执行此操作的正确位置。您不需要特定的字段(它只是一个 CharField),但您需要一个特定于表单字段的验证,并且可能需要清理/规范化数据。

\n
\n\n

例如,您可能想要类似的东西:

\n\n
class MyForm(forms.Form)\n    def clean_name(self):\n        name = self.cleaned_data[\'name\']\n        if myModel.objects.filter(name=name).exists():\n            raise forms.ValidationError(\'The name [%s] already exists\' % name)    \n        return name\n
Run Code Online (Sandbox Code Playgroud)\n