私は数日間このことを理解しようとしていて、有用な情報をオンラインで見つけることができませんでした。 私がしようとしているのは、ドロップダウンメニューを使ってフィルタリングし、AJAX経由でPythonにデータを供給した後、モデルのオブジェクトをページ付けすることです。私は問題がどこにあるのか知っていますが、解決方法はわかりません。私は2つのテンプレートを持って、最初のものは次のとおりです。AJAXを使用してフィルタ処理された結果のDjangoページ番号
entry_index.html:
{% if objects %}
{% for object in objects %}
do something
{% endfor %}
<div class="pagination">
<span class="step-links">
{% if objects.has_previous %}
<a href="?page={{ objects.previous_page_number }}">previous</a>
{% endif %}
<span class="current">
Page {{ objects.number }} of {{ objects.paginator.num_pages }}.
</span>
{% if objects.has_next %}
<a href="?page={{ objects.next_page_number }}">next</a>
{% endif %}
</span>
</div>
:
{% extends 'main/base.html' %}
<form action="" method="get" accept-charset="utf-8">
<select class="selectpicker" name="times" onchange="FilterCategories()" id="times">
<option value="1">last 24 hours</option>
<option value="30">past month</option>
<option value="365">past year</option>
<option value="10000">all time</option>
</select>
</form>
<ul id="all-games" class="list-unstyled">
{% include page_template %}
</ul>
上記テンプレートに含まれているテンプレートはentry_index_page.htmlですurls.py:
url(r'^$', views.entry_index, name='index')
views.py:
def entry_index(
request,
template='entry_index.html',
page_template='entry_index_page.html'):
date_from = timezone.now() - timezone.timedelta(days=1)
obj_list=Object.objects.filter(submitted__gte = date_from).order_by('-votes')
message=[]
context = {
'objects': obj_list,
'page_template': page_template}
if request.is_ajax():
template = page_template
message = []
if request.method == "GET":
time_range = request.GET.get('time_range')
if time_range is not None and time_range != u"":
time_range = request.GET['time_range']
date_from = timezone.now() - timezone.timedelta(days=int(time_range))
obj_list= Object.objects.filter.filter(submitted__gte=date_from)
paginator = Paginator(obj_list, 2)
page = request.GET.get('page')
try:
objects= paginator.page(page)
except PageNotAnInteger:
objects= paginator.page(1)
except EmptyPage:
objects= paginator.page(paginator.num_pages)
context.update({"message":message,"objects":objects})
return render_to_response(
template, context, context_instance=RequestContext(request))
ajax.js:今
function FilterCategories() {
var timePosted = document.getElementById('times');
$.ajax({
type: "GET",
url: "",
data: {
'time_range': timePosted.value,
'csrfmiddlewaretoken': $("input[csrfmiddlewaretoken]").val()
},
success: filterResults,
dataType: 'html'
});
}
私が起こっていると思うものを説明すると、うまくいけば、誰かが解決策を見つける私を助けることができます。
ホームページが読み込まれると(entry_index.html)、モデルはドロップダウンメニューの最初のオプションに基づいてフィルタリングされます(つまり、最終日に送信されたデータエントリをフィルタリングするvalue = "1")。 。 obj_list変数に値が設定され、ページ設定に渡され、すべてが期待通りに機能します。私は特定の数のページを取得し、ページをナビゲートすることができます。ここでもう一度ホームページにいると仮定して、ドロップダウンメニューから「すべての時間」を選択します。これにより、onchangeコールバックがトリガーされ、FilterCategories()関数が呼び出されます。 AJAXのURLは ""(空の文字列なので、インデックスページを指していることに注意してください)。 urls.pyによると、それは私のentry_index()ビューを呼び出すでしょう。 requestはajaxなので、使用されるテンプレートは変更されます(page_templateは新しいテンプレートpage_template = entry_index_page.htmlになります)。新しい時間範囲はドロップダウンメニューで指定され、ajaxで渡されるため、新しいobj_listを取得してページを作成し、「オブジェクト」を生成し、コンテキストとしてテンプレートに渡します。この時点までは、すべてが期待通りに機能します。私は適切な量のページを取得します。しかし、問題は、新しく選択したフィルタで次のページに移動しようとすると始まります。次のページボタンをクリックすると、行われているリクエストはajaxリクエストではないので、request.is_ajax()の条件にあるものはすべて実行されません。つまり、次のページをクリックすると、再びentry_indexビューが呼び出され、今回使用されているテンプレートはentry_index.htmlで、フィルタはデフォルト(「過去24時間」フィルタ)にリセットされます。したがって、次のページをクリックすると、実際にはデフォルトのホームページになり、新しく選択されたドロップダウンフィルターでオブジェクトの次のページが表示されます。
私の質問は、私は私のフィルタモデルのページをスクロールできるように、この問題を解決する簡単な方法はありますか?あるいは、私はこのアプローチを完全に断念し、これを行う簡単な方法がありますか?私は長いポストを謝罪し、誰かが私を助けてくれることを願っています。これを読んでいただきありがとうございます。
私はちょうどこの特定の手法を実践するために、ほとんどのブラウザのSFゲームをツーリングした。ここ
私は完全にあなたのプロセスを以下ではないんだけど、あなたが見つけるかもしれません単一のテンプレートを使用する方が簡単で、新しいページの読み込みを行うのではなく、AJAXを使用してページ自体のHTMLのデータやチャンクを置き換えるだけです。それはより速く、動く部品が少なくなります。 –