我目前正在编写我的第一个Django Web应用程序,虽然很有趣,但是遇到了我需要渲染的页面。
该网站是NFL预测游戏网站,人们可以每周一次选择比赛的获胜者。
要完成此任务,我需要建立团队,用户,预测,得分(针对我的比赛,而非NFL游戏),游戏和结果的模型。结果和游戏模型从NFL XML和JSON提要中提取数据。团队是所有32个团队的静态模型。预测,结果和游戏模型都共享一个GameID属性。
预测有一个得分字段,该字段会作为“结果”上保存功能替代的一部分进行更新,该字段随后会针对每个用户的每周得分计数更新得分模型。
我可以通过Django管理控制台和Django shell为用户添加预测-现在,我需要继续创建一个网页,用户只需单击一个按钮,即可简单地选择每个比赛的获胜者。
此页面有一个基本布局,可以让我开始使用基于功能的视图,该视图目前仅列出给定一周的所有固定装置。
我正在使用Materialize CSS主题,因此每场比赛都将显示为一张纸牌,其divID为GameID,并且其中的各队都有其徽标(我没有使用官方的徽标),ID为Home或Away(即预测模型所期望的值)。
所以我想我确实需要两件事的帮助:-
1)如何通过此页面递归处理多个新对象的POST; &
2)如何允许用户单击任一徽标,以及如何使最终的“提交”按钮知道他们单击了哪些选项(并确认所有选项均被单击)-我假设为此需要一些JavaScript?我知道几乎没有Java脚本(在这方面确实是新的),所以朝着正确方向的任何指针将不胜感激。
来自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)