如何在跟踪先前项目的同时从Django中的列表中返回一个新的非重复项目?

时间:2019-03-28 04:12:37

标签: django session random django-queryset data-persistence

我正在开发一个用户可以选择类别的应用程序,它将从该类别返回随机选择。我要实现的主要功能是选择一个项目后,就无法再在会话中对其进行随机选择。

例如,我们有 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]
  • 用户刷新:
    • 选择了随机[5]
    • 城市现在有[1]
  • 用户刷新:
    • 选择了随机[1]
    • 城市现在有[]
  • 用户被重定向到首页

我认为我的问题在于必须配置会话或cookie才能使数据持久保存在匿名会话中。最终,我将添加一个Users模块,以便保存每个用户的浏览历史记录,但现在我希望它像匿名用户一样工作。

我尝试将SESSION_SAVE_EVERY_REQUEST = True添加到settings.py并将request.session.modified = True放入我的views.py中,尽管我怀疑我是否正确实现了它们。我已经阅读了有关会话和Cookie的一些问题,但找不到与我的问题相关的内容。 Django Sessions Doc似乎很有趣,但势不可挡。我不确定从哪里开始尝试将会话方面连接在一起。

我想知道是否有一种简便/ Pythonic的方式来实现我的Web应用程序从列表中为我提供一个非重复项,直到会话中没有任何项。

1 个答案:

答案 0 :(得分:1)

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