Как передать данные из одной функции View в другую для многошаговой формы?
В настоящее время я работаю над созданием сайта по управлению хоккейной лигой. Функция, над которой я сейчас работаю, это ввод "Отчета об игре". Это место, где хранитель счета вводит все детали игры после ее завершения. Сама функция отчета об игре требует 3 шага для завершения.
Selecting the game for which you want to enter the report for.
A form which populates the roster of both teams, with a checkbox for each player to mark off if they played in the game. In addition, there is 2 separate formsets to add players for either team if they aren't already on the roster.
The final part of the game report, where you enter in the goals, penalties, and the game results. Where the goals and penalties are formsets, and the game results are a simple model form.
Путаница возникает из-за того, что данные с предыдущего шага требуются для текущего шага.
Выбор вида игры (шаг 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 может передавать данные из одного представления в другое только через базу данных. Поэтому, если вы хотите сделать форму в несколько шагов, вам нужно сделать временную модель, которая будет хранить данные первой формы доступными для второй.
Для поддержания чистоты БД, добавьте временную метку создания в вашу временную модель, и очищайте эту временную модель время от времени на основе временной метки.
Это немного неприятно, но это самое прямое решение.
Вы можете использовать модель 'Context' с 2 полями : JSONField и ForeignKey для пользователя. Это позволит вам сериализовать/десериализовать нативный словарь python в библиотеку и сделать связь с пользователем и, соответственно, предыдущей формой.
Другим решением было бы хранить эту информацию на стороне клиента. Но это потребует полной трансформации вашего решения в нечто совершенно иное, как, например, Django Rest (API) + React или Vue или js.