Django - 检查对象是否存在

时间:2016-12-29 07:08:20

标签: 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)

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

错误:

  

/ model / local变量中的UnboundLocalError' name'   在分配前引用

我做错了什么?

注意: 如果我将name = 'jesus'添加到我的代码中并且jesus存在则可行,但这不是我想要的。

我想检查输入的名称是否存在显示msg

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

1 个答案:

答案 0 :(得分:0)

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

def foo(request):
    titulo = "something"
    form = MyForm(request.POST or None)
    queryset = myModel.objects.all()
    context = {
        "titulo": titulo,
        "form": form,
        "queryset": queryset,
    }

    if form.is_valid():
        name = form.cleaned_data['name']
        if myModel.objects.filter(name=name).exists():
            messages.error(request, 'already exists')
        else:                
            instance = form.save()
            messages.success(request, 'Added')
            return redirect('/')
    return render(request, "forms7.html", context)    

理想情况下,您的表单中有clean_name函数,以便您的视图不那么复杂。您可以阅读有关创建此类方法的更多信息here

  

例如,如果要验证CharField的内容   名为serialnumber的是唯一的,clean_serialnumber()是正确的   这样做的地方。你不需要特定的领域(它只是一个   CharField),但是你需要一个特定于表单域的验证,   可能,清理/规范化数据。

例如,您可能需要以下内容:

class MyForm(forms.Form)
    def clean_name(self):
        name = self.cleaned_data['name']
        if myModel.objects.filter(name=name).exists():
            raise new forms.ValidationError('The name [%s] already exists' % name)    
        return name