0

Django を使用してショップのフィルター メニューを作成しています。チェックボックスが選択されている場合、ユーザーが GET フォームを送信すると、サイトは同じ URL にリダイレクトされますが、新しい製品の結果が表示されます。

フィルタにはフィルタされた製品が表示されますが、以前に選択されていたチェックボックスは選択されていません。選択したチェックボックスを維持したいと思います。どうすればそうできますか?

これは私の Chocolate-menu.html です:

<form action = '/chocolate-menu' method ='GET'  >
            <table width = "595px" class = "center_filter" style ="border-collapse:collapse;table-layout:fixed">
                <tr>
                    <td width = "110px" class = "no_border"> <span style = "color:9A8478;font-family: Helvetica Neue, Arial;font-weight: bolder; font-size:20px">Filter by</span> </td>
                    <td width = "119px"> <span style = "color:C39A6B;  font-weight: bold; font-size:18px">Price </span></td>
                    <td width = "119px"> <span style = "color:C39A6B;  font-weight: bold; font-size:18px">Flavour </span></td>
                    <td width = "128px"> <span style = "color:C39A6B;  font-weight: bold; font-size:18px">Special Diet </span></td>
                    <td width = "119px"> <span style = "color:C39A6B; font-weight: bold; font-size:18px">Calories </span></td>
                </tr>

                <tr>
                    <td class = "no_border"></td>
                    <td>  <input type="checkbox" style="margin-right: 10px;" id="five_to_ten" value='five_to_ten' name='five_to_ten' >&pound;5 - &pound;10</td>
                    <td> <input type="checkbox" style="margin-right: 10px;" id="dark" value = "dark" name = "dark">Dark </td>
                    <td> <input type="checkbox" style="margin-right: 10px;" id="lactose_free" value='lactose_free' name = "lactose-free">Lactose-free </td>
                    <td> <input type="checkbox" style="margin-right: 10px;" id="zero_to_hundret" value = 'zero_to_hundret' name='zero_to_hundret'>  0 - 100 </td>
                </tr></table></form>

これは、views.py のチョコレート メニュー関数です。

def showChocoMenu(request):
    connection = pyodbc.connect('Driver={SQL Server Native Client 11.0};Server=xx;Database=xx;Uid=xx;Pwd=xx;Encrypt=yes;Connection Timeout=30;')
    cur = connection.cursor()
    filter = "this filter gets a string that complements the SQL query later"
    if (filter == ''):
        cur.execute("SELECT distinct choco_name, choco_price FROM chocolates c, stock s WHERE c.choco_ID=s.choco_ID AND s.availability > 0 AND s.country ='UK'")
        chocolateMenu = cur.fetchall()
        cur.close()
        connection.close() 
    else:
        cur.execute("SELECT distinct choco_name, choco_price FROM chocolates c, stock s WHERE c.choco_ID=s.choco_ID AND s.availability > 0 AND s.country ='UK' AND " + filter )
        chocolateMenu = cur.fetchall()
        cur.close()
        connection.close() 
    return HttpResponse(render_to_string('chocolate_menu.html',{'chocolateMenu':chocolateMenu}))
4

1 に答える 1

2

GET パラメータをテンプレートに戻す必要があります。存在する場合checkedは、入力の属性を「checked」に設定します。

# long-winded example for clarity
def showChocoMenu(request):
    ...
    five_to_ten = request.GET.get('five_to_ten')
    dark = request.GET.get('dark')
    lactose_free = request.GET.get('lactose-free')
    zero_to_hundret = request.GET.get('zero_to_hundret')

    return HttpResponse(render_to_string('chocolate_menu.html', 
        {'chocolateMenu':chocolateMenu, 'five_to_ten': five_to_ten,
        'dark': dark, 'lactose_free': lactose_free,
        'zero_to_hundret': zero_to_hundret}))

# shorter way
def showChocoMenu(request):
    ...
    context = {'chocolateMenu': chocolateMenu}
    for key in ['five_to_ten', 'dark', 'lactose_free', 'zero_to_hundret']:
        context.update({key: request.GET.get(key)})

    return HttpResponse(render_to_string('chocolate_menu.html', context))

# chocolate_menu.html
...
<tr>
    ...
    <td>
        <input type="checkbox" style="margin-right: 10px;" id="five_to_ten"
        value="five_to_ten" name="five_to_ten"
        {% if five_to_ten %}checked="checked"{% endif %} />
        &pound;5 - &pound;10
    </td>
    ...
</tr>
于 2013-10-11T11:48:14.563 に答える