djangoのテンプレートの変数をプルダウンで切り替えたい
djangoのバージョン:3.1.7
pythonのバージョン:3.8.5
以下は,models.pyのPostテーブルに記録されている投稿をindex.htmlに全て表示するためのviews.pyです.
(views.py) def Index(request): post_list_desc = Post.objects.all().order_by('-created_at') #作成日が新しい順で表示する post_list_asc = Post.objects.all().order_by('created_at') #作成日が古い順で表示する context = { 'post_list_desc': post_list_desc, 'post_list_asc': post_list_asc, } return render(request, 'myapp/index.html', context)
テンプレートのindex.htmlに表示方法を昇順または降順に切り替える(変数を切り替える)ためのプルダウンを設けて,切り替えられるようにしたいのですが,
(index.html) {% for item in post_list_desc %}
または
(index.html) {% for item in post_list_asc %}
とするのではなく
(index.html) {% for item in 変数 %} #条件に応じて変数をpost_list_descまたはpost_list_ascに切り替えられるようにする
のようにして,プルダウンで昇順・降順を切り替える(変数を切り替える)方法が思いつかないので,お分かりの方はお教えいただければ助かります.
試しにhttps://hodalog.com/how-to-set-a-value-of-a-variable-inside-a-template-code/を参考に
(index.html) <div class="row"> <a class="nav-link dropdown-toggle" id="navbarDropdownMenuLink" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">並替</a> <div class="dropdown-menu dropdown-primary" aria-labelledby="navbarDropdownMenuLink"> <form action='' method='POST'> {% csrf_token %} <input type='submit' {% with ordering = post_list_asc %}{% endwith %}>{{ ordering }}</p> <input type='submit' {% with ordering = post_list_desc %}{% endwith %}>{{ ordering }}</p> </form> </div> <!-- Card deck --> <div class="card-deck"> {% for item in ordering %} (以下省略)
としてみたら,
TemplateSyntaxError at /
'with' expected at least one variable assignment
というエラーが出てきており,詰まっています.
(追加)
以下の通りにしてみたのですが,並び順が変わりませんでした.
(index.html) <a class="nav-link dropdown-toggle" id="navbarDropdownMenuLink" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">並替</a> <div class="dropdown-menu dropdown-primary" aria-labelledby="navbarDropdownMenuLink"> <form action='' method='POST'> {% csrf_token %} <input type='submit' name='asc'>昇順</p> <input type='submit' name='desc'>降順</p> </form> </div>
(views.py) def Index(request): post_list_asc = Post.objects.all() post_list_desc = Post.objects.all().reverse() if request.POST.get('name')=='asc': post_list = post_list_asc context = { 'post_list': post_list, } return render(request, 'myapp/index.html', context) else: post_list = post_list_desc context = { 'post_list': post_list, } return render(request, 'myapp/index.html', context)
回答3件
あなたの回答
tips
プレビュー