如何从Django中的列表返回新的非重复项,同时跟踪以前的项?

如何从Django中的列表返回新的非重复项,同时跟踪以前的项?,django,session,random,django-queryset,data-persistence,Django,Session,Random,Django Queryset,Data Persistence,我正在开发一个应用程序,用户可以选择一个类别,它将返回该类别的随机选择。我试图实现的主要功能是,一旦选择了一个项目,就不能再在会话中随机选择它 例如,我们有3类照片:风景照片、城市照片和肖像照片,每一类都有5张照片。用户选择城市,然后重定向到包含城市类别中随机照片的详细信息页面。他可以刷新页面或单击按钮从该类别中获取新照片。当新照片中没有该类别的照片时,他会被重定向回家 通过将查询集转换为列表,我可以从所选类别中获取随机项,但数据不会持久化。每次刷新时,我的列表都会重置,因此以前选择的照片会再次

我正在开发一个应用程序,用户可以选择一个类别,它将返回该类别的随机选择。我试图实现的主要功能是,一旦选择了一个项目,就不能再在会话中随机选择它

例如,我们有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]从城市中选择 urban现在有[1,2,4,5] 用户刷新: 随机选择[4] urban现在有[1,2,5] 用户刷新: 随机选择[2] urban现在有[1,5] 用户刷新: 随机选择[5] urban现在有[1] 用户刷新: 随机选择[1] 城市现在有[] 用户被重定向到主页 我认为我的问题在于必须配置会话或cookie,以使数据在匿名会话中持久化。最终,我将添加一个用户模块,这样每个用户都将保存他们的浏览历史,但现在我希望它能像匿名用户一样工作

我已经尝试将SESSION\u SAVE\u EVERY\u REQUEST=True添加到settings.py,并将REQUEST.SESSION.modified=True放置在my views.py中,尽管我怀疑我是否正确实现了它们。我已经阅读了一些关于会话和cookie的SO问题,但未能找到解决我的问题的方法。这场比赛似乎很有趣,但却势不可挡。我不确定从哪里开始尝试将会话方面连接在一起


我想知道是否有一种简单的方法来实现让我的web应用程序从列表中给我一个不重复的项目,直到会话中没有剩下任何项目。

你的问题是你的变量没有从一个请求转移到下一个请求。最好的方法是使用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', {})

谢谢你的快速回复。这听起来像是我要找的。今晚我将实现类似的功能,并向您提供最新信息。非常感谢,Hybrid。我已经更新了视图以反映上述更改。现在我一直得到一个'str'对象没有属性'session'错误。是否有特定的方式来激活或分配会话?我已经检查了settings.py和中间件,所有内容都默认为Django 2.1,并且工作正常。