如何基于一系列二进制选择创建一个表单以将多个新对象发布到模型中?

时间:2019-06-10 15:11:17

标签: django django-forms django-views

我目前正在编写我的第一个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)

0 个答案:

没有答案