簡體   English   中英

如何在 django 中以一種形式過濾具有多種形式/多種選項的結果表?

[英]How can I filter a results table with multiple forms/multiple options in one form in django?

我想要一個包含多個篩選器選項(例如名稱、縮寫、國家/地區...)的頁面,您可以在其中以表格形式輸入瑞典,並且僅獲得瑞典機構的結果或輸入名稱/縮寫/...您按下“搜索”按鈕。 然后,搜索按鈕會將您重定向到過濾后的結果表。

forms.py

class InstitutionsForm(forms.Form):
     name = forms.CharField(label='Name', required=False)
     abbreviation = forms.CharField(label='Abbreviation', required=False)

視圖.py

def institution_search_form(request):
    if request.method == "POST":
        form = InstitutionsForm(request.POST)
        if form.is_valid():
            return institution_results_name(request, form)  
    else:
        context = {
            "form": InstitutionsForm
        }
        return render(request,"stakeholders/institution_form.html", context)

def institution_results_name(request, form):
    all_insts = Institution.objects.filter(name=form.cleaned_data["name"])
    context = {
    "result_data":=SafeString(serializers.serialize("json", all_insts)),
    }
    return render(request, "landing/result_table.html", context)

institution_form.html

<form method="post">
  {{ form.as_p }}
  {% csrf_token %}
  <input type="submit" value="Search">
</form>

到目前為止,我確實在一頁上獲得了我在 forms.py 中定義的所有 CharFields。

我的問題是我無法搜索國家、縮寫等。只有“名稱”有效。

我嘗試編寫不同的 forms,甚至將它們放在不同的 url 上,但都只是在輸入名稱后進行過濾。 對於一個國家,我只會得到一個空的結果表。

我也嘗試過為每個表格寫不同的視圖,並在所有地方將“名稱”更改為“國家”,但仍然無法獲得正確的結果。

def institution_results_country(request, form):
    all_insts = Institution.objects.filter(name=form.cleaned_data["country"])
    context = {
    "result_data":=SafeString(serializers.serialize("json", all_insts)),
    }
    return render(request, "landing/result_table.html", context)

(與 institution_search_form 相同。 -> institution_search_form_country().... return institution_country()

希望有人能幫助我:歡迎所有想法:)

在你的情況下(只有名字有效)是因為你在過濾方法中指定了名字。 如果您需要根據更多字段進行過濾,請同時指明它們。 有關詳細信息,請參閱官方文檔

因此,如果您想根據 2 列名稱和國家/地區進行過濾,那么您的 function 將如下所示:

def institution_results_country(request, form):
    all_insts = Institution.objects.filter(name=form.cleaned_data["name"], country=form.cleaned_data["country"])
    context = {
    "result_data":=SafeString(serializers.serialize("json", all_insts)),
    }
    return render(request, "landing/result_table.html", context)

它是這樣工作的。 您必須創建一個包含名稱、縮寫和國家/地區三個字段的表單。 將所有這些字段設置為required=False 以下是表單的代碼。

# Your form 
class SearchInstitutionsForm(forms.Form):
    name = forms.CharField(required=False)
    abbreviation = forms.CharField(required=False)
    country = forms.CharField(required=False)

現在在搜索視圖中,您必須根據用戶填寫的字段進行過濾。 你的觀點是這樣的。

    # Your search view
    def search_institutions(request):
        form = SearchInstitutionsForm()
        qs = Institution.objects.all()
        if request.method == "POST":
            form = SearchInstitutionsForm(request.POST)
            if form.is_valid():
                cd = form.cleaned_data
                if cd['name']:
                    qs = Institution.objects.filter(name__contains=cd['name'])
                if cd['abbreviation']:
                    qs = Institution.objects.filter(
                        abbreviation__contains=cd['abbreviation'])
                if cd['country']:
                    qs = Institution.objects.filter(
                        country__contains=cd['country']
                    )
        
        context {
            'result_data':=SafeString(serialize.serialize("json", qs)),
            'form': form
        }
        return render(request, "landing/result_table.html", context)

暫無
暫無

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

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