我在Django项目中进行了简单的搜索。除了按名称搜索之外,我想使用他们的类型和工厂信息的一部分来搜索文档。 这是我的 models.py:
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)
我的 forms.py:
class DocsSearchForm(ModelForm):
class Meta:
model = Docs
fields = [ 'Name', 'Type', 'Part']
这是我的 views.py 的一部分,如果没有进行搜索,则会给出所有文档
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}
所以,问题如下:如果我尝试使用搜索,那么我有 / showdocs上的NameError 名字'类型'没有定义。 POST值包括:Part' 1',Name' Example',Type' 1'。
如果我删除
Type==request.POST['Type']|
Part==request.POST['Part']
然后按名称搜索效果很好。所以我猜测问题是关于按外键值搜索,但没有更多的想法。将不胜感激任何帮助。
答案 0 :(得分:0)
尝试用此
替换该行Docs.objects.filter(Name__contains=request.POST['Name'],
Type=request.POST['Type'],
Part=request.POST['Part']
)
您似乎误解了语法。我不知道你为什么要在这里使用|
运算符。
答案 1 :(得分:0)
这不是Django过滤器的工作方式。你不能|
他们,因为他们实际上不是表达式,只是关键字参数。在这种情况下,正确的语法是:
Docs.objects.filter(
Name__contains=request.POST['Name'],
Type_Type=request.POST['Type'],
Part_Name=request.POST['Part'],
)`