私はブートストラップアコーディオン(see here)のような形式でレシピを表示するウェブページを作ろうとしています。私はそうのように、このためにカスタムテンプレートタグを作ったDjangoのブートストラップアコーディオン:オープンアコーディオンセクションのデータのみをロードするには?
<div class="panel-group" id="accordion">
{% for recipe in recipes %}
<div class="panel panel-default">
<div class="panel-heading">
<h4 class="panel-title">
<a data-toggle="collapse" data-parent="#accordion" href="#collapse{{ forloop.counter }}">
{{ recipe }}
</a>
</h4>
</div>
<div id="collapse{{ forloop.counter }}" class="panel-collapse collapse">
<div class="panel-body">
<table class="table table-hover">
{% for ingredient in foodtype|ingredients_in_recipe:recipe %}
<tr>
<td>
{{ ingredient.ingredient_name }}
</td>
<td>
{{ ingredient.ingredient_quantity }}
</td>
</tr>
{% endfor %}
<p>{{ recipe.details }}</p>
</table>
</div>
</div>
</div>
{% endfor %}
</div>
: これは私が今のようにそれをやっている方法です
@register.filter
def ingredients_in_recipe(foodtype, recipe):
return foodtype.ingredient_set.filter(recipe=recipe).order_by("ingredient_name")
問題は、私は200件の以上のレシピやロードを持っているということですこのデータはすべて遅すぎます。理想的には、テンプレートタグ関数ingredients_in_recipeは、ユーザーがレシピをクリックしたときにのみ呼び出されるべきです。しかし、私が理解しているように、Djangoはそれをすべて実行してから、レンダリングされたHTMLをユーザーに送信するため、これは不可能です。
私はこの問題を回避することができますが、まだアコーデオンスタイルを絵のように維持していますか?事前に
おかげで、 マックス
EDIT:ここでは、テンプレートに到達する前にそのロジックを実行するだけでなく
def detail(request, foodtype_id):
foodtype = get_object_or_404(foodtype, id=foodtype_id)
recipe = foodtype.recipe_set.values_list('recipe').order_by('recipe').distinct()
context = {
'foodtype': foodtype,
'recipe': recipe,
}
return render(request, 'main/detail.html', context)
私はそれをやってみました。それはちょっと役立ちます。 –
私はorder_byの後に.distinct()を追加するのを忘れていました。いくつかの成分が繰り返されるかもしれないので、私はそれが必要ですが、そこに置くと、ウェブページsoooはせずにずっと遅くなります。アイデア? –
あなたは 'recipes'を得るためにどのメソッドを使用しているのかを見ることができるようにビューを投稿できます – awwester