Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django多字段搜索表单_Python_Django_Forms - Fatal编程技术网

Python Django多字段搜索表单

Python 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

我有一个查询表单,它从3个字段获取输入,并显示数据库模型中相关的匹配内容。 但是我试图从表单上的三个字段中只选择一个字段,并且需要从与该字段相关的数据库模型中获取数据

views.py

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
where
form.is\u valid()
处理结果筛选,而
POST
where
form.is\u valid()
返回false将返回现有表单对象以显示验证错误。@Dave:Ya。我用GET提交表单,html表单中的submit按钮也是“GET”。如果条件对我不起作用。如何仅获取一个字段的匹配数据而不选择表单中的其他字段?如果
If release\u num:
等语句不起作用,则从表单的HTTP get请求获取数据时可能会遇到问题。考虑打印<代码>请求。获取和窗体。CueLeDeDATA数据< /代码>字典以查看表单输入是否以您所期望的方式到达。