Я сейчас пишу свое первое веб-приложение на Django, и мне очень весело, но я поразил кирпичную стену страницей, которую мне нужно отрисовать.
Сайт представляет собой игровой сайт, посвященный прогнозам НФЛ, с помощью которого люди могут выбирать победителей игры неделя за неделей.
Для этого у меня есть модели для команд, пользователей, прогнозов, результатов (для моего соревнования, а не для игр в НФЛ), игр и результатов. Модели Results и Games извлекают данные из каналов NFL XML и JSON. Команды - статическая модель для всех 32 команд. Модели Predictions, Results и Game имеют свойство GameID.
Предсказания имеют поле оценки, которое обновляется как часть переопределения функции сохранения для результатов, которое само затем обновляет модель баллов для подсчета еженедельной оценки каждого пользователя.
Я могу добавлять прогнозы для пользователей через консоль администрирования Django и через оболочку Django, но теперь мне нужно перейти к созданию веб-страницы, где пользователи могут просто выбрать победителя каждого матча одним нажатием кнопки.
У меня есть базовый макет для этой страницы, чтобы я начал использовать представление на основе функций, которое в настоящее время просто перечисляет все приборы для данной недели.
Я использую CSS-тему Materialise, чтобы каждый матчпап показывался в виде карточки с идентификатором div ее идентификатора GameID, и команды в нем имеют свои логотипы (я не использую официальные) с идентификаторами Home или Away (что является значение, которое ожидает модель Predictions).
Так что, полагаю, мне нужна помощь с двумя вещами: -
1) Как обработать POST для нескольких новых объектов рекурсивно через эту страницу; &
2) Как разрешить пользователю нажимать любой логотип, и чтобы последняя кнопка «Отправить» знала, какие параметры были нажаты (и что все они были проверены) - я полагаю, для этого мне понадобится некоторый javascript? Я знаю, что рядом нет Javascript (действительно нового в этом отношении), поэтому любые указатели в правильном направлении будут действительно оценены.
От urls.py: -
path('predict/', CreatePredictionsViewfunc, name='new-prediction-view')
Из views.py (статические значения для тестирования): -
def CreatePredictionsViewfunc(request):
context = {
'predictions':Prediction.objects.all(),
'matches':Match.objects.filter(Week=17, Season=2018)
}
return render(request, 'predictor/predict.html', context)
Predict.html: -
{% extends "predictor/base.html" %}
{% block content %}
<div class="container">
<div class="row">
{% for match in matches %}
<div class="col s12 m6 l4">
<div class="card grey lighten-5">
<div class="card-content white-text" id="{{ match.GameID }}">
<span class="card-title red-text darken-4 center-align">{{ match.AwayTeam.Nickname }} @ {{ match.HomeTeam.Nickname }}</span>
<div class="center-align">
<img class="responsive-img hoverable" src="{{ match.AwayTeam.Logo.url }}" id="Away" alt="{{ match.AwayTeam }}"> <img class="responsive-img hoverable" src="{{ match.HomeTeam.Logo.url }}" id="Home" alt="{{ match.HomeTeam }}">
</div>
</div>
<!---div class="card-action"-->
<!--/div-->
</div>
</div>
{% endfor %}
</div>
{% endblock content %}
Прогноз от models.py: -
class Prediction(models.Model):
User = models.ForeignKey(User, on_delete=models.CASCADE)
Game = models.ForeignKey(Match, related_name='Match_Prediction_Set', on_delete=models.CASCADE)
winner_choices = (('Home','Home'), ('Away','Away'))
Winner = models.CharField(max_length=4, choices=winner_choices)
Points = models.IntegerField(blank=True, null=True)
class Meta:
unique_together = ("User", "Game")
def __str__(self):
return('{}, {}, {}'.format(self.User, self.Game, self.Winner))
def save(self, *args, **kwargs):
if self.Points == None:
super(Prediction, self).save(*args, **kwargs)
else:
# below code will add the points for individual
# predictions to user's weekly score tracker
try:
Scores.objects.get(User=self.User, Week=self.Game.Week)
except Scores.DoesNotExist:
# create new weekly score entry if none already exists
addweekscore = Scores(User=self.User, Week=self.Game.Week, Weekscore=self.Points, Season=self.Game.Season)
addweekscore.save()
else:
# if a weekly score object exists, add the points to it
weekscore = Scores.objects.get(User=self.User, Week=self.Game.Week)
weekscore.Weekscore += self.Points
weekscore.save()
super(Prediction, self).save(*args, **kwargs)