繁体   English   中英

获取查询集中的下一个项目

[英]Getting the next Item in a queryset

这是 Voting web 项目的片段,我正在尝试在投票后获得下一个类别...

当用户成功投票后,我希望页面重定向到下一个类别...我所做的是获取该类别的 id 然后将变量保存为 next_category ,原始类别的 id 增加一(next_category = category .id + 1)。

但是正如你所知道的,Django 并没有严格地使 id 序列化,所以如果我之前删除了一个类别,比如说 cat 5,我有 cat1 cat2 考虑到 cat10,当它到达 cat4 时,它会有问题

Nominees 视图提供特定类别的页面,Voting 视图是表单处理视图。 希望它的解释性足够。

@login_required
def Nominees(request, category_id):
    categories = Category.objects.get(id=category_id)
    next_category = categories.id +1
    college_id = categories.College.id
    if lastday < today:
        messages.info(request, "Window closed")
    context = {'categories':categories, 'college_id':college_id, 'lastday':lastday, 'today':today,'next_category':next_category}
    return render(request, 'nomination/contestants.html', context )

def Voting(request):
    if request.method == "POST": 
        vote_user = request.POST.get('vote_user')
        vote_contestant = request.POST.get('vote_contestant')
        vote_category = request.POST.get('vote_category')
        next_category = request.POST.get('next_cat')
        vote_college = request.POST.get('vote_college')
        college = College.objects.get(pk=int(vote_college))
        college_id = college.id
        nex = int(next_category)-1
        try:
            Vote.objects.filter(user_id=request.user.id, category_id=vote_category)[0]
            messages.error(request, "You've already voted")
            return HttpResponseRedirect(reverse('nomination:nominees', args=(vote_category,)))
        except(IndexError, Vote.DoesNotExist):
            if lastday < today:
                messages.error(request, "Too late")
                return HttpResponseRedirect(reverse('nomination:nominees', args=(vote_category,)))
            else:
                new_vote = Vote(contestant_id=vote_contestant, category_id=vote_category, college_id=vote_college, user_id=vote_user)
                new_vote.save()
                messages.success(request, "Successfully voted!!")
                try:
                    categories = college.category_set.filter(id=next_category, College_id=college_id)[nex]
                    category_id=categories.id
                    return HttpResponseRedirect(reverse('nomination:nominees', args=(category_id,)))
                except (IndexError, Category.DoesNotExist):
                    categories = college.category_set.first()
                    category_id = categories.id
                    return HttpResponseRedirect(reverse('nomination:categories', args=(college_id,)))

如果我能找到更好的方法,我也会很感激,比如可能使用我尝试过的下一个 function,但它仍然给我带来了问题。

所以以防万一有些人仍然试图弄清楚我后来找到了另一种方法,我将查询集转换为一个列表并使用索引 function:

def Nominees(request, category_id):
    category = Category.objects.get(id=category_id)
    college_id = category.College.id
    college = College.objects.get(id=college_id)
    categories = list(college.category_set.all())
    next_category = (categories.index(category)) + 1
    if lastday < today:
        messages.info(request, "Window closed")
    context = {'categories':category, 'college_id':college_id, 'lastday':lastday, 'today':today,'next_category':next_category}
    return render(request, 'nomination/contestants.html', context )

def Next(request):
    next_category = request.POST.get('next_cat')
    college_id = request.POST.get('college_id')
    college = College.objects.get(id=int(college_id))
    nex = int(next_category)
    nxcate = list(college.category_set.all())
    if request.method =="POST":
        try:
            name = nxcate[nex]
            nxcat = college.category_set.filter(Name=name)[0]
            print(nxcat, nxcat.id)
            return HttpResponseRedirect(reverse('nomination:nominees', args=(name.id,)))
        except IndexError:
            name = nxcate[0]
            print('\n',name)
            messages.info(request,"Thank you for voting!!!")
            return HttpResponseRedirect(reverse('nomination:categories', args=(college_id,)))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM