Django 将保存变量重置为 0,最好在主视图中

Posted

技术标签:

【中文标题】Django 将保存变量重置为 0,最好在主视图中【英文标题】:Django reset a save variable to 0, preferably at home view 【发布时间】:2021-02-01 15:51:33 【问题描述】:

我正在创建一个简单的测验(已完成 99%),只需要最后一件事的帮助 - 对于中级/高级程序员来说可能微不足道。我创建了一个保存变量来保存用户的当前分数。这样用户就可以从一个页面导航到另一个页面,并且仍然可以看到他们当前的分数。

当用户浏览最后一个模板视图时,它会给出最终分数和重定向到主页的链接。这允许用户有机会“重新参加测验”。此时(主页)我需要帮助将保存的分数变量重置为 0。

请让我知道我该怎么做,提前谢谢!

models.py

    class Scorer(models.Model):
        score = models.IntegerField(default=0)
        page = models.IntegerField()
        condition_number = models.IntegerField(default=0)

views.py

class IndexView(generic.ListView):
    template_name = 'quizzes/index.html'
    context_object_name = 'latest_question_list'

    def get_queryset(self):
        """Return the first published question """
        return Question.objects.filter(id=1)


def vote(request, question_id, *args, **kwargs):
    model = Question
    template_name = 'quizzes/vote.html'
    question = get_object_or_404(Question, pk=question_id)

    
    ### To create user scoring system ###
    scorer, created = Scorer.objects.get_or_create(page=1)


    try:
        selected_choice = question.answer_set.get(pk=request.POST['answer'])



        ### To save user score ###
        if selected_choice in Answer.objects.filter(id=1):
            scorer.score +=10
            scorer.save()
        elif selected_choice in Answer.objects.filter(id=6):
            scorer.score +=10
            scorer.save()
        elif selected_choice in Answer.objects.filter(id=12):
            scorer.score +=10
            scorer.save()
        elif selected_choice in Answer.objects.filter(id=13):
            scorer.score +=10
            scorer.save()
        elif selected_choice in Answer.objects.filter(id=19):
            scorer.score +=10
            scorer.save()
        elif selected_choice in Answer.objects.filter(id=22):
            scorer.score +=10
            scorer.save()
        elif selected_choice in Answer.objects.filter(id=28):
            scorer.score +=10
            scorer.save()
        elif selected_choice in Answer.objects.filter(id=30):
            scorer.score +=10
            scorer.save()
        elif selected_choice in Answer.objects.filter(id=36):
            scorer.score +=10
            scorer.save()
        elif selected_choice in Answer.objects.filter(id=37):
            scorer.score +=10
            scorer.save()
        elif selected_choice in Answer.objects.filter(id=38):
            scorer.score +=10
            scorer.save()
        elif selected_choice in Answer.objects.filter(id=40):
            scorer.score +=10
            scorer.save()

【问题讨论】:

您想访问模板中任何位置的变量,但是当您点击主页视图时,如果我理解,该变量会重置为 0? 是的,这是正确的@BriseBalloches。我已经在我的模板中访问变量。当我点击主页视图时,只需将其重置为 0。到目前为止,分数还在不断增加。当有人试图重新参加测验时没有意义。 与首页匹配的视图是什么? 对不起,忘了包括那个。我现在已经这样做了。请参见上面的“IndexView”@BriseBalloches 在您的 Scorer 模型中,您是否有与 quizz 和 user 的外键?在您的 get_queryset(self) 中,您只需检索它并将其设置为 0。 【参考方案1】:

我更新了主页视图 (IndexView),它现在可以工作了。当用户到达问题 1 时,只需创建一个 IF 语句。然后分数消失并从 0 开始。为清楚起见,请参见下文:

class IndexView(generic.ListView):
    template_name = 'quizzes/index.html'
    context_object_name = 'latest_question_list'

    
    
    def get_queryset(self):
        
        scorer, created = Scorer.objects.update_or_create(page=1)
        
        ### To reset scores to 0 ###
        if Question.objects.filter(id=1):
            scorer.score = (scorer.score - scorer.score)
            scorer.save()

        """Return the first published question """
        return Question.objects.filter(id=1)

【讨论】:

以上是关于Django 将保存变量重置为 0,最好在主视图中的主要内容,如果未能解决你的问题,请参考以下文章

如何在Javascript中每24小时将变量重置为0?

会话被 django-all auth 重置

JS为什么整数变量被重置为初始值但数组变量不是?

无法为 Django 的重置密码流程创建集成测试

应用程序关闭后如何快速保存全局变量?

Django通用类视图实现忘记密码重置密码功能