簡體   English   中英

如何將數據從一個視圖 function 傳遞到另一個視圖以獲得多步驟表單?

[英]How to pass data from one View function to another for a multi-step form?

我目前正在開發一個曲棍球聯盟管理網站。 我目前正在開發的功能是輸入“游戲報告”。 比賽結束后,記分員會在此處輸入該比賽的所有詳細信息。 游戲報告功能本身需要 3 個步驟才能完成。

  1. 選擇您要為其輸入報告的游戲。

  2. 填寫兩支球隊名單的表格,每個球員都有一個復選框,用於標記他們是否參加了比賽。 此外,如果他們還沒有在名冊上,則有 2 個單獨的表單集可以為任何一支球隊添加球員。

  3. 比賽報告的最后一部分,您可以在其中輸入目標、處罰和比賽結果。 目標和點球是表格,比賽結果是簡單的 model 表格。

混淆來自上一步的數據是當前步驟所必需的。

SelectGame 視圖(第 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)

Django 只能通過數據庫將數據從一個視圖發送到另一個視圖。 因此,如果您想分幾個步驟制作一個表格,您需要制作一個臨時 model 來保持第一個表格的數據可用於第二個表格。

為了使您的數據庫保持清潔,請在您的臨時 model 中添加創建時間戳,並根據時間戳不時清理此臨時 model。

這有點討厭,但這是最直接的解決方案。

您可以使用帶有 2 個字段的“上下文”model:用戶的 JSONField 和 ForeignKey。 這將允許您將 python 本機字典序列化/反序列化到庫中,並與用戶建立鏈接等以前的形式。

另一種解決方案是將這些信息保留在客戶端。 但這需要將您的解決方案完全轉換為完全不同的東西,例如 Django Rest (API) + React 或 Vue 或 js。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM