Здесь нужно рассмотреть пару вещей. На стороне сервера вы должны быть в состоянии поддерживать, какой «блок» в списке заметок находится у пользователя. Самый простой способ сделать это, вероятно, Django paginator . Он работает в основном, беря QuerySet
, устанавливая счетчик для количества элементов, затем присваивая ему номер "страницы" (или номер "чанка"), и возвращает эти элементы.
Вы могли бы сделать это с JSON, но было бы так же легко сделать это и с HTML. Когда мы посмотрим на клиентскую часть этого, вы поймете, почему.
Таким образом, мы можем иметь представление «api» для обработки заметки «chunk» (обратите внимание, что все мои примеры кода здесь сокращены только для демонстрации. Вы хотели бы иметь обработку ошибок и все такое) ...
def get_notes_chunk(request, *args, **kwargs):
# Get our notes, however...
all_notes = Notes.objects.all()
# Paginate them based on the page we're on...
chunk_number = request.GET.get('c')
paginator = Paginator(all_notes, 20) # (show 20 at a time)
current_chunk = paginator.page(chunk_number)
# Render to template all that jazz
render_to_template( ... , { 'paginator':paginator, 'current_chunk':current_chunk }, ...)
Наш шаблон отображает <li>
теги, которые мы вставим в <ul>
на клиенте ...
{% for note in current_chunk.object_list %}
<li>{{ note }}</li>
{% endfor %}
Теперь на клиенте нам нужно написать некоторый JavaScript, чтобы справиться с этим. Вам решать, на каком событии запустить обновление, но что касается того, как, мы можем использовать небольшой jQuery для обработки этого ...
<script type="text/javascript">
var chunk_count = 1;
var notes_list_id = 'notes-list'
function load_next_chunk() {
chunk_count += 1;
$.get('{% url get_notes_chunk %}?c=' + chunk_count, function(html) {
$('#'+notes_list_id).append(html);
});
}
</script>
<body>
...
<ul id="notes-list">
<!-- Render chunk #1 here -->
</ul>
...
</body>
Некоторые вещи, которые, вероятно, имели бы смысл ...
- Измените рендеринг списка заметок в тег шаблона, чтобы вы могли повторно использовать его для своего API и основного рендеринга вашей страницы
- Рефакторинг запроса / разбиения на страницы модели Notes (или любой другой), чтобы вы могли повторно использовать ее в обоих представлениях
- Выясните, в каком событии будет загружен следующий блок, и реализуйте его.