Python Django多字段搜索表单
我有一个查询表单,它从3个字段获取输入,并显示数据库模型中相关的匹配内容。 但是我试图从表单上的三个字段中只选择一个字段,并且需要从与该字段相关的数据库模型中获取数据 views.pyPython Django多字段搜索表单,python,django,forms,Python,Django,Forms,我有一个查询表单,它从3个字段获取输入,并显示数据库模型中相关的匹配内容。 但是我试图从表单上的三个字段中只选择一个字段,并且需要从与该字段相关的数据库模型中获取数据 views.py from django.shortcuts import render from search.forms import ModuleForm from django.http import HttpResponse from search.models import Module,Metamodule,Rele
from django.shortcuts import render
from search.forms import ModuleForm
from django.http import HttpResponse
from search.models import Module,Metamodule,Release
def searchview(request):
if request.method == 'GET':
form = ModuleForm(request.GET)
if form.is_valid():
release_num = form.cleaned_data['release_num']
metamodule_name = form.cleaned_data['metamodule_name']
module_name = form.cleaned_data['module_name']
results = Module.objects.filter(metamodule__release__number=release_num).filter(metamodule__name=metamodule_name).filter(name=module_name)
return render(request,'search/search_result.html',{'form': form, 'results': results})
else:
form = ModuleForm()
return render(request, 'search/search_form.html',{'form': form})
forms.py
from django import forms
from search.models import Module,Release,Metamodule
class ModuleForm(forms.Form):
release_num = forms.ModelChoiceField(queryset=Release.objects.all(),empty_label='Pick a Release')
metamodule_name = forms.ModelChoiceField(queryset=Metamodule.objects.all(),empty_label='Pick a Meta module')
module_name = forms.ModelChoiceField(queryset=Module.objects.all(),empty_label='Pick a Module')
def clean_release_number(self):
try:
release_num = self.cleaned_data.get["release_num"]
metamodule_name = int(self.cleaned_data["metamodule_name"])
module_name = int(self.cleaned_data["module_name"])
except:
release_num = None
metamodule_name = None
module_name = None
if release_num and Module.objects.exclude(metamodule__release__number=release_num).exists():
raise forms.ValidationError("Please enter a valid release number.")
else:
return release_num
如何修改视图以接受单个输入并显示数据,即使其他两个字段未提供数据?请考虑检查每个字段并分别筛选该字段值
if form.is_valid():
release_num = form.cleaned_data['release_num']
metamodule_name = form.cleaned_data['metamodule_name']
module_name = form.cleaned_data['module_name']
results = Module.objects.all()
if release_num:
results = results.filter(metamodule__release__number=release_num)
if metamodule_name:
result = results.filter(metamodule__name=metamodule_name)
if module_name:
result = results.filter(name=module_name)
return render(request,'search/search_result.html',{'form': form, 'results': results})
由您使用clean\u fieldname()
方法验证输入。考虑使用<代码> DEFCURE(自)执行多字段验证(如至少有一个字段填充)。
为什么要在GET
上处理表单输入?您使用GET
提交表单数据而忽略POST
是否有原因
另外,虽然检查
form.is\u valid()
并实现clean\u fieldname
方法很好,但您需要在if-form.is\u valid():
中添加一个else
子句来处理form.errors
如果三个字段中的任何一个都已填写,输入是否有效?如果填写了两个或全部三个字段会怎么样?是否应使用所有提供的输入?是。它应该支持所有填写的输入。要么是一个填充的,要么是多个。我想应该是视图中需要的一些if-else条件。不确定如何将该逻辑放入视图中。我正在检查模型数据库并获取过滤后的数据,因此使用GET。我尝试了上述代码,但如果在下拉列表中未选择该值,则不会显示输出?如果您在浏览器中提交表单,request.method
应与HTML表单中的submit方法匹配。这就是为什么我要问GET
和POST
。通常,GET
应该构造一个新的空表单,POST
whereform.is\u valid()
处理结果筛选,而POST
whereform.is\u valid()
返回false将返回现有表单对象以显示验证错误。@Dave:Ya。我用GET提交表单,html表单中的submit按钮也是“GET”。如果条件对我不起作用。如何仅获取一个字段的匹配数据而不选择表单中的其他字段?如果If release\u num:
等语句不起作用,则从表单的HTTP get请求获取数据时可能会遇到问题。考虑打印<代码>请求。获取和