2017-11-30 1 views
0

Ich habe eine einfache Suche in meinem Django-Projekt. Ich möchte Dokumente mit ihrem Typ und einem Teil der Fabrikinformationen durchsuchen und zusätzlich nach Namen suchen. Hier ist meine models.py:NameError in Django einfache Suche

class Docs(models.Model): 
    Date = models.DateField(default=date.today) 
    Name = models.CharField(max_length=50) 
    Type = models.ForeignKey(DocTypes) 
    Part = models.ForeignKey(Parts) 
    Link = models.FileField(upload_to='Docs/%Y/%m/%d') 
class Parts(models.Model): 
    Name = models.CharField(max_length=50) 
    def __str__(self): 
     return str(self.Name) 
class DocTypes(models.Model): 
    Type = models.CharField(max_length=50) 
    def __str__(self): 
     return str(self.Type) 

Mein forms.py:

class DocsSearchForm(ModelForm): 
    class Meta: 
     model = Docs 
     fields = [ 'Name', 'Type', 'Part'] 

Und das ist ein Teil meiner views.py wurde, wenn keine Suche dann alles getan Dokumente sind gegeben

def showdocs(request): 
    if request.method == 'POST': 
     form = DocsSearchForm(request.POST) 
     documents = Docs.objects.filter(Name__contains=request.POST['Name']| 
              Type==request.POST['Type']| 
              Part==request.POST['Part']) 
    else: 
     form = DocsSearchForm() 
     documents = Docs.objects.all() 
    return render(
     request, 
     'showdocs.html', 
     {'documents': documents, 'form':form} 

Also, das Problem ist die fol lowing: Wenn ich versuche, eine Suche zu verwenden, dann habe ich NameError at/showdocs Name 'Typ' ist nicht definiert. POST-Werte sind: Teil '1', Name 'Beispiel', Typ '1'.

Wenn ich

Type==request.POST['Type']| 
Part==request.POST['Part'] 

dann nach Namen gut funktioniert Suche löschen. Ich vermute also, dass es bei diesem Problem darum geht, nach Fremdschlüsselwerten zu suchen, aber keine Ideen mehr haben. Ich werde jede Hilfe zu schätzen wissen.

Antwort

0

Versuchen Sie, die Linie mit diesem

Docs.objects.filter(Name__contains=request.POST['Name'], 
        Type=request.POST['Type'], 
        Part=request.POST['Part'] 
        ) 

ersetzen Es scheint, dass Sie die Syntax falsch verstanden haben. Ich weiß nicht, warum Sie versuchen, | Operator hier zu verwenden.

0

So funktionieren Django-Filter nicht. Sie können nicht | sie, weil sie nicht wirklich Ausdrücke sind, nur Schlüsselwortargumente. In diesem Fall wäre die korrekte Syntax:

Docs.objects.filter(
    Name__contains=request.POST['Name'], 
    Type_Type=request.POST['Type'], 
    Part_Name=request.POST['Part'], 
)`