2015-10-08 3 views
1

У меня есть веб-сайт, который показывает фотографии, которые всегда добавляются и люди видят дубликаты между страницами на домашней странице (последние добавленные фотографии)Джанго нумерацией страниц в то время как объекты добавляются

Я не совсем уверен, как подойти к этой проблеме, но это в основном Что происходит:

  • Главная страница отображает последние 20 фотографий [0:20]
  • прокрутке (пока фотографии добавляются в БД
  • пользователь загружает следующую страницу (через ajax)
  • На странице отображаются фотографии [20:40]
  • Пользователь видит дубликаты фотографий, потому что фотографии, добавленные в верхней части списка толкнул их на следующей странице

Что такое лучший способ решить эту проблему ? Я думаю, мне нужно как-то кэшировать запрос на сеанс пользователей, может быть? Я не знаю много о тайниках действительно так шаг за шагом объяснение было бы бесценным

здесь есть функция, которая получает новую страницу изображений:

def get_images_paginated(query, origins, page_num): 
    args = None 
    queryset = Image.objects.all().exclude(hidden=True).exclude(tags__isnull=True) 
    per_page = 20 
    page_num = int(page_num) 
    if origins: 
     origins = [Q(origin=origin) for origin in origins] 
     args = reduce(operator.or_, origins) 
     queryset = queryset.filter(args)   


    if query: 
     images = watson.filter(queryset, query) 
    else: 
     images = watson.filter(queryset, query).order_by('-id') 
    amount = images.count() 
    images = images.prefetch_related('tags')[(per_page*page_num)-per_page:per_page*page_num] 

    return images, amount 

вида, который использует функцию:

def get_images_ajax(request): 
    if not request.is_ajax(): 
     return render(request, 'home.html') 

    query = request.POST.get('query') 
    origins = request.POST.getlist('origin') 
    page_num = request.POST.get('page') 

    images, amount = get_images_paginated(query, origins, page_num) 
    pages = int(math.ceil(amount/20)) 
    if int(page_num) >= pages: 
     last_page = True; 
    else: 
     last_page = False; 
    context = { 
     'images':images, 
     'last_page':last_page, 
    } 

    return render(request, '_images.html', context) 
+0

Ваша функция не является видом джанго. он не получает HttpRequest и не возвращает HttpResponse, как ваш аякс разговаривает с этой функцией? – doniyor

+0

Моя ошибка, это не вид, а только основная функция, которая получает изображения, которые используются разными видами. – davegri

+0

, то, пожалуйста, покажите, что вид – doniyor

ответ

2

Один из подходов можно сделать, это отправить старейший идентификатор, который клиент в настоящее время имеет (т.е. идентификатор последнего элемента в списке в настоящее время) в запросе AJAX, а затем убедитесь, что вы только запрос старше идентификаторы.

Так get_images_paginated изменяется следующим образом:

def get_images_paginated(query, origins, page_num, last_id=None): 
    args = None 
    queryset = Image.objects.all().exclude(hidden=True).exclude(tags__isnull=True) 
    if last_id is not None: 
     queryset = queryset.filter(id__lt=last_id) 
    ... 

Вы должны послать последний идентификатор в запросе AJAX, и передать его из вашей функции представления в get_images_paginated:

def get_images_ajax(request): 
    if not request.is_ajax(): 
     return render(request, 'home.html') 

    query = request.POST.get('query') 
    origins = request.POST.getlist('origin') 
    page_num = request.POST.get('page') 
    # Get last ID. Note you probably need to do some type casting here. 
    last_id = request.POST.get('last_id', None) 

    images, amount = get_images_paginated(query, origins, page_num, last_id) 
    ... 

Как @ doniyor говорит, что вы должны использовать Django в разбивке на страницы в сочетании с этой логикой.

+0

Точно такой же простой подход, который я искал, спасибо – davegri

 Смежные вопросы

  • Нет связанных вопросов^_^