2016-12-29 159 views
0

我试图检查一个对象是否存在于我的表单中,但是出现错误。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

错误:

UnboundLocalError at /model/ local variable 'name' referenced before assignment

我究竟做错了什么?

注: 如果我添加name = 'jesus'到我的代码和jesus存在,它的工作原理,但是这不是我多么希望。

我要检查,如果我输入名称存在给我味精

有人能帮助我吗?谢谢。

+3

哪里变量'name'是从哪里来的? –

回答

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

For example, if you wanted to validate that the contents of a CharField called serialnumber was unique, clean_serialnumber() would be the right place to do this. You don’t need a specific field (it’s just a CharField), but you want a formfield-specific piece of validation and, possibly, cleaning/normalizing the data.

例如,你可能想是这样的:

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