Как я могу создать форму для публикации нескольких новых объектов в модели на основе серии двоичных вариантов? - PullRequest
0 голосов
/ 10 июня 2019

Я сейчас пишу свое первое веб-приложение на 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)
...