![](/img/trans.png)
[英]Django - Pass a <select> form POST data from one view to another
[英]How to pass data from one View function to another for a multi-step form?
我目前正在開發一個曲棍球聯盟管理網站。 我目前正在開發的功能是輸入“游戲報告”。 比賽結束后,記分員會在此處輸入該比賽的所有詳細信息。 游戲報告功能本身需要 3 個步驟才能完成。
選擇您要為其輸入報告的游戲。
填寫兩支球隊名單的表格,每個球員都有一個復選框,用於標記他們是否參加了比賽。 此外,如果他們還沒有在名冊上,則有 2 個單獨的表單集可以為任何一支球隊添加球員。
比賽報告的最后一部分,您可以在其中輸入目標、處罰和比賽結果。 目標和點球是表格,比賽結果是簡單的 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.