【问题标题】:How to pass data from one View function to another for a multi-step form?如何将数据从一个视图函数传递到另一个视图函数以实现多步骤表单?
【发布时间】:2021-12-31 01:21:49
【问题描述】:

我目前正在开发一个冰球联盟管理网站。我目前正在开发的功能是输入“游戏报告”。比赛结束后,记分员会在此处输入该比赛的所有详细信息。游戏报告功能本身需要 3 个步骤才能完成。

  1. 选择您要为其输入报告的游戏。

  2. 填写两支球队名单的表格,每个球员都有一个复选框,用于标记他们是否参加了比赛。此外,如果他们还没有在名单上,还有 2 个单独的表单集可以为任何一支球队添加球员。

  3. 比赛报告的最后一部分,您可以在其中输入目标、点球和比赛结果。目标和点球是formset,而比赛结果是一个简单的模型形式。

混淆来自上一步的数据对于当前步骤是必需的这一事实。

选择游戏视图(第 1 步) - 此处没有问题

@login_required(login_url="/login/")
def selectGame(request):
    games = Game.objects.all().values(
        'iceSlot__date',
        'homeTeam__name',
        'awayTeam__name',
        'id'
    )
    context = {'games': games}
    return render(request, "home/select-game.html", context)

从第 1 步到第 2 步的转换发生在 select-game.html 中(也没有问题)

<a href="{% url 'gameReportRoster' game.id %}" class="btn btn-fill btn-primary btm-sm">Select</a>

gameReportRoster 视图(第 2 步)- 位于此处的问题试图获取来自该视图的数据,转到第 2 步

@login_required(login_url="/login/")
def gameReportRoster(request, pk):
    # Need to add in to the Game Form, the season for the game
    game = Game.objects.get(id=pk)
    homeTeam = Team.objects.get(id=game.homeTeam_id)
    awayTeam = Team.objects.get(id=game.awayTeam_id)
    homeTeamPlayers = Player.objects.filter(team__id=homeTeam.id).all().values().order_by('lastName')
    awayTeamPlayers = Player.objects.filter(team__id=awayTeam.id).all().values().order_by('lastName')
    currentSeason = Season.objects.get(currentSeason=True)
    formsetHomeTeam = PlayerFormSet(queryset=Player.objects.none(), prefix='home')
    formsetAwayTeam = PlayerFormSet(queryset=Player.objects.none(), prefix='away')

    games = Game.objects.all().values(
        'iceSlot__date',
        'homeTeam__name',
        'awayTeam__name',
        'id'
    )
    context = {
        'games': games,
        'homeTeam': homeTeam,
        'awayTeam': awayTeam,
        'homeTeamPlayers': homeTeamPlayers,
        'awayTeamPlayers': awayTeamPlayers,
        'formsetHomeTeam': formsetHomeTeam,
        'formsetAwayTeam': formsetAwayTeam,
    }

    if request.method == 'POST':
        OMMITED BUSINESS LOGIC HERE

        allPlayersWhoPlayed = Player.objects.filter(id__in=allPlayedList)

        teams = Team.objects.filter(id__in=teamList)
        gameResultForm = GameResultForm(teams=teams)

        formsetGoal = GoalFormSet(form_kwargs={'players': allPlayersWhoPlayed}, prefix='goal')
        formsetPenalty = PenaltyFormSet(form_kwargs={'players': allPlayersWhoPlayed}, prefix='penalty')

        context = {
            'formsetGoal': formsetGoal,
            'formsetPenalty': formsetPenalty,
            'gameResultForm': gameResultForm
        }
        # return gameReportStats(request, context)
        return render(request, "home/game-report-stats.html", context)

    return render(request, "home/game-report-roster.html", context)

这是我完全陷入困境的地方,我需要将我从该视图创建的新 Context dict 放到这个视图中,它可以正确呈现所有内容

@login_required(login_url="/login/")
def gameReportStats(request, context):
    if request.method == 'POST':
        print('Test')
    return render(request, "home/game-report-stats.html", context)

【问题讨论】:

  • 我不明白被注释掉的return gameReportStats(request, context)只是取消注释并删除return render(request, "home/game-report-stats.html", context)
  • @Ahtisham 如果我删除这两个,我将如何访问我的模板并查看统计信息?主页/game-report-stats.html
  • 我没有说只删除渲染部分
  • @Ahtisham 哦,我明白你现在的意思了,所以目前注释掉的原因,因为当我使用它时,URL 仍然显示相同,并且仍然显示 game-report-roster/PK .此外,当我使用它时,它会自动在 gameReportStats 中进行发布请求
  • 我不明白你的问题,如果我错了,请纠正我你只想将你在gameReportRoster创建的字典发送到gameReportStats,这样上下文就可以传递给@987654329 @html 上下文将在哪里显示?

标签: python django django-views django-templates


【解决方案1】:

Django 只能通过数据库将数据从一个视图发送到另一个视图。因此,如果您想分多个步骤制作表单,则需要制作一个临时模型,以保持第一个表单的数据可用于第二个表单。

为了让你的数据库保持干净,在你的临时模型中添加一个创建时间戳,并根据时间戳不时清理这个临时模型。

这有点讨厌,但这是最直接的解决方案。

您可以使用具有 2 个字段的“上下文”模型:用户的 JSONField 和 ForeignKey。这将允许您将 python 本机字典序列化/反序列化到库中,并与用户建立链接,等等以前的形式。

另一种解决方案是将这些信息保留在客户端。但这需要将您的解决方案完全转换为完全不同的东西,例如 Django Rest (API) + React 或 Vue 或 js。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-09
    • 2015-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多