Я работаю над приложением, в котором пользователь может выбрать категорию, которая вернет случайный выбор из этой категории. Основная функциональность, которую я пытаюсь реализовать, заключается в том, что после выбора элемента его больше нельзя выбирать случайным образом в сеансе.
Например, у нас есть 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})
Функциональность, которую я ищу, (где каждое число является объектом/элементом в списке):
Я считаю, что моя проблема заключается в том, чтобы настроить либо сеансы, либо файлы cookie, чтобы данные сохранялись в анонимном сеансе. В конце концов я добавлю модуль «Пользователи», чтобы у каждого пользователя сохранялась история посещенных страниц, но пока я хочу, чтобы он работал как анонимный пользователь.
Я пытался добавить SESSION_SAVE_EVERY_REQUEST = True к settings.py и поместить request.session.modified = True в свой views.py, хотя сомневаюсь, что правильно их реализую. Я прочитал несколько вопросов SO о сеансах и файлах cookie, но не смог найти что-то, что помогло бы решить мою проблему. Документ о сессиях Django казался интересным, но подавляющим. Я не уверен, с чего начать, пытаясь поэкспериментировать с соединением аспектов сеансов вместе.
Мне интересно, есть ли простой/Pythonic способ добиться того, чтобы мое веб-приложение давало мне неповторяющийся элемент из списка до тех пор, пока в сеансе не останется ни одного.





Ваша проблема в том, что ваша переменная не переносится из одного запроса в другой. Лучший способ сделать это — использовать 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', {})
Я обновил представление, чтобы отразить вышеуказанные изменения. Теперь я продолжаю получать сообщение о том, что объект «str» не имеет атрибута «session». Есть ли особый способ активировать сеанс или назначить его? Я проверил свои settings.py и промежуточное ПО, и все по умолчанию установлено на Django 2.1 и работает нормально.
Спасибо за быстрый ответ. Это похоже на то, что я ищу. Я собираюсь реализовать что-то подобное сегодня вечером и информировать вас. Большое спасибо, Гибрид.