簡體   English   中英

Django多字段搜索表單

[英]Django multiple field search form

我有一個查詢表單,該表單從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})

表格

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_fieldname()方法來驗證輸入。 考慮使用def clean(self)執行多字段驗證(例如至少填充一個字段)。

為什么要在GET上處理表單輸入? 為什么要使用GET提交表單數據而忽略POST呢?

此外,雖然這是很好的,你正在檢查form.is_valid()和實施clean_fieldname方法,你需要將添加else子句if form.is_valid():它處理form.errors

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM