Django - 处理多个表单字段

时间:2016-06-19 22:49:40

标签: python django forms

我是Python / Django的新手,非常感谢我能得到的任何帮助!

我正在尝试接受多个表单字段,并且无法找到一个很好的干净方法。我的代码试图为每个实例接受一个外键选择(团队)和一个数字(下注大小)。

我最终创建了迭代request.POST.items的代码,以确定每个团队属于哪个游戏,哪个工作正常,但是我无法将Bet尺寸的输入作为“值”字段已经分配给每个游戏。

我使用模型表单而不是我选择的方法进行了辩论,但找不到一种很好的方法来接收外键数据。

您如何建议更改代码以接受投注大小字段?是否有其他方法可以使用您建议的模型表单进行处理?

请在下面找到我的代码!

提前致谢

Views.py:

def pick_game(request):
# Check what kind of request this is? GET/POST?
if request.method == 'GET':
    game_list = Game.objects.order_by('-picks')
    # form = PickGameForm()
    page_variables = {
        "game_list": game_list, 'form':form
    }
    return render(request, 'social/pickGame.html', page_variables)
else:

    for key, value in request.POST.items():
        print(key, value)
        if "choice" in key:
            game_id = int(key.split("_")[1])
            team_id = int(value)
            game = Game.objects.get(pk=game_id)
            team = Team.objects.get(pk=team_id)
            PlayerPick.objects.create(
                player_profile=request.user.playerprofile,
                game=game,
                team=team,
                bet_size=bet_size
            )

        else:
            bet_size = request.POST.get('Bet')

pickGame.html:

<h1>Games</h1>

<form method="post">
    {% csrf_token %}
    {% for game in game_list %}

        <h2>Game {{ game.number }}</h2>

        <p><input type="radio" name="{{ game.pk }}" value="{{ game.team1.pk }}"> {{ game.team1.name }}</p>
        <p><input type="radio" name="{{ game.pk }}" value="{{ game.team2.pk }}"> {{ game.team2.name }}</p>
        <p><input type="number" name="Bet"> How much Money? </p>

    {% endfor %}
    <hr>
    <button type="submit">Submit</button>
</form>

PlayerPick模型:

class PlayerPick(models.Model):
player_profile = models.ForeignKey('PlayerProfile')
team = models.ForeignKey('Team')
game = models.ForeignKey('Game')
bet_size = models.IntegerField(default=0, blank=True)
correct = models.BooleanField(default=False, blank=True)
pick_time = models.DateTimeField(auto_now_add=True)

1 个答案:

答案 0 :(得分:0)

我认为您的手动方法非常好,您所要做的就是找到一种方法来为每个游戏唯一识别Bet字段。你可以在你的html中使用它:

#loader {
  position: absolute;
  left: 50%;
  top: 50%;
  z-index: 1;
  width: 150px;
  height: 150px;
  margin: -75px 0 0 -75px;
  border: 16px solid #f3f3f3;
  border-radius: 50%;
  border-top: 16px solid #3498db;
  width: 120px;
  height: 120px;
  -webkit-animation: spin 2s linear infinite;
  animation: spin 2s linear infinite;
}

@-webkit-keyframes spin {
  0% { -webkit-transform: rotate(0deg); }
  100% { -webkit-transform: rotate(360deg); }
}

@keyframes spin {
  0% { transform: rotate(0deg); }
  100% { transform: rotate(360deg); }
}

/* Add animation to "page content" */
.animate-bottom {
  position: relative;
  -webkit-animation-name: animatebottom;
  -webkit-animation-duration: 1s;
  animation-name: animatebottom;
  animation-duration: 1s
}

@-webkit-keyframes animatebottom {
  from { bottom:-100px; opacity:0 }
  to { bottom:0px; opacity:1 }
}

@keyframes animatebottom {
  from{ bottom:-100px; opacity:0 }
  to{ bottom:0; opacity:1 }
}

然后在创建PlayerPick对象之前获取视图中的值:

<input type="number" name="{{game.pk}}-Bet">

如果您想使用Django Forms,您还可以在创建表单时使用bet_size = request.POST.get('%s-Bet' % game.pk) 参数来模仿此行为。您必须为未绑定和绑定的表单定义此项,以便可以识别带前缀的字段名称:

prefix