Как я могу вернуть новый неповторяющийся элемент из списка в Django, отслеживая предыдущие элементы? - PullRequest
1 голос
/ 28 марта 2019

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

Например, у нас есть 3 категории фотографий: пейзаж,городские и портреты, каждый с 5 фото .Пользователь выбирает городские, а затем перенаправляется на страницу сведений со случайной фотографией из городской категории.Он может либо обновить страницу, либо нажать кнопку, чтобы получить новое фото из этой категории.Когда в этой категории нет новых фотографий, он перенаправляется домой.

Я могу получить свой случайный элемент из выбранной категории путем преобразования набора запросов в список, но данные не сохраняются.При каждом обновлении список, который у меня сбрасывается, таким образом, ранее выбранная фотография может появляться снова, игнорируя тот факт, что я удалил элемент из списка после его выбора.

Вот views.py с функциейОтветственный за это:

def randomPhoto(request, pk, **kwargs):

    # queryset to get all photos from selected category
    gallery = list(Photos.objects.filter(id=pk)
    .values_list("partof__category", flat=True))

    # select random photo from list
    last = len(gallery) -1
    randomInt = random.randint(0, last)
    randomPic = gallery[randomInt]

    gallery.remove(randomPic)

    if len(gallery) == 0:
        return render(request, 'gallery/category_select.html')

        photoDetails = {
        'category' : Category.objects.get(id=pk),
        'author' : Author.objects.get(tookin__category=randomPic),
        'uploadedPhoto' : 'http://localhost:8000/media/' + 
    str(Photo.objects.get(category=randomPic).photoUpload),
        'randomPic' : randomPic,
        }

        return render(request, 'gallery/random_photo.html', {'photoDetails': photoDetails})

Функциональность, которую я ищу, (где каждый номер является объектом / элементом в списке):

  • Пользователь выбирает категорию города:
    • Городской имеет следующие предметы: [1, 2, 3, 4, 5]
    • Случайный [3] выбран из городского
    • Городской теперь имеет [1, 2, 4,5]
  • Пользователь обновляет:
    • случайный [4] выбран
    • городской теперь имеет [1, 2, 5]
  • Пользователь обновляет:
    • В случайном порядке [2] выбрано
    • Городской теперь имеет [1, 5]
  • Пользователь обновляет:
    • random [5] selected
    • urban теперь имеет [1]
  • Пользователь обновляет:
    • random [1] selected
    • городской теперь имеет []
  • Пользователь redirected home

Я полагаю, что моя проблема заключается в необходимости настроить сеансы или файлы cookie для сохранения данных в анонимном сеансе.Со временем я добавлю модуль «Пользователи», чтобы у каждого пользователя была сохранена история просмотра, но сейчас я хочу, чтобы он работал как анонимный пользователь.

Я попытался добавить SESSION_SAVE_EVERY_REQUEST = True к settings.py ипоместив request.session.modified = True в мой views.py, хотя я сомневаюсь, что реализую их правильно.Я прочитал несколько вопросов о сеансах и файлах cookie, но не смог найти что-то, что помогло бы решить мою проблему.Документ Django Sessions Doc показался интересным, но ошеломляющим.Я не уверен, с чего начать пытаться экспериментировать с соединением аспектов сессий.

Мне интересно, есть ли простой / Pythonic способ добиться, чтобы мое веб-приложение дало мне неповторяющийся элемент из спискапока в сеансе не останется ни одного.

1 Ответ

1 голос
/ 28 марта 2019

Ваша проблема в том, что ваша переменная не передается от одного запроса к следующему.Лучший способ сделать это - использовать request.session = ... для установки переменной, а затем проверить ее позже и выполнить действия.Вот пример, который вы можете расширить, чтобы сделать его по своему вкусу:

import random
from django.shortcuts import redirect

class TestView(View):
    def get(self, request, *args, **kwargs):

        gallery = request.session.get('gallery', None)
        if (type(gallery) is list) and (len(gallery) == 0):  # When list is empty, clear session & then redirect
            del request.session['gallery']
            request.session.modified = True
            return redirect('<your_redirect_url>')
        if gallery is None:  # If first visit to page, create gallery list
            gallery = list(models.Photos.objects.all().values_list("partof__category", flat=True))

        # select random photo from list
        last = len(gallery) -1
        randomInt = random.randint(0, last)
        randomPic = gallery[randomInt]
        gallery.remove(randomPic)

        request.session['gallery'] = gallery

        return render(request, 'test.html', {})
...