如果这个 django 表单本身也生成选项,为啥它不接受我的输入?
Posted
技术标签:
【中文标题】如果这个 django 表单本身也生成选项,为啥它不接受我的输入?【英文标题】:Why doesn't this django form accept my input if it also generates the options itself?如果这个 django 表单本身也生成选项,为什么它不接受我的输入? 【发布时间】:2022-01-08 19:07:23 【问题描述】:这是一个比赛经理,随机匹配比赛的参与者,我称之为配对游戏。游戏是一个 django 模型,带有一个名为“ganador”的属性来存储游戏的获胜者。为了选择获胜者,我使用了一个名为 formaGanador 的 modelform_factory,并排除了模型的所有属性,除了“ganador”属性。属性“ganador”具有“选择”选项,因此表单只允许选择该游戏的参与者之一,而不能选择其他游戏的参与者。最后,当我从列表中选择一个参与者并按下表单上的提交按钮时,我收到以下响应:选择一个有效的选择。玩家 A 不是可用的选择之一。
model.py 中的游戏模型:
class Juego(models.Model):
torneo = models.ForeignKey(Torneo, on_delete=models.CASCADE, null=False)
ronda = models.ForeignKey(Ronda, on_delete=models.CASCADE, null=False)
jugadorA = models.ForeignKey(Jugador, on_delete=models.SET_NULL, null=True, related_name='jugadorA')
jugadorB = models.ForeignKey(Jugador, on_delete=models.SET_NULL, null=True, related_name='jugadorB')
puntuacionA = models.IntegerField(default=0)
puntuacionB = models.IntegerField(default=0)
ganador = models.ForeignKey(Jugador, on_delete=models.SET_NULL, null=True, default=None, choices=[('Jugador A', 'Jugador A'), ('Jugador B', 'Jugador B')])
在视图中创建表单:
GanadorForm = modelform_factory(Juego, exclude=['torneo', 'ronda', 'jugadorA', 'jugadorB', 'puntuacionA', 'puntuacionB'])
从模板传递和接收表单“formaganador”:
def detalleTorneo(request, id):
torneo = Torneo.objects.get(pk=id)
jugadoresPares = False
jugadores = torneo.jugadores.all()
no_jugadores = jugadores.count()
rondas = Ronda.objects.filter(torneo=torneo)
juegos = Juego.objects.filter(torneo=torneo)
if request.method == 'POST':
formaGanador = GanadorForm(request.POST)
if formaGanador.is_valid():
formaGanador.save()
else:
formaGanador = GanadorForm()
if (no_jugadores % 2) == 0:
jugadoresPares = True
return render(request, 'torneos/detalle.html', 'juegos': juegos, 'torneo': torneo, 'no_jugadores': no_jugadores, 'jugadoresPares': jugadoresPares, 'rondas': rondas, 'formaGanador': formaGanador)
在模板中显示“formaGanador”表单:
% for ronda in rondas %
<h3>Ronda ronda.numero</h3>
<ul>
% for juego in juegos %
% if juego.ronda == ronda %
<li><form method="post"><strong>juego.jugadorA.nombre juego.jugadorA.apellido vs juego.jugadorB.nombre juego.jugadorB.apellido</strong> | formaGanador <button type="submit">Ingresar Resultados</button>% csrf_token %<br></form></li>
% endif %
% endfor %
</ul>
% endfor %
为西班牙语中的变量道歉。
【问题讨论】:
【参考方案1】:Django 本身不会生成选项。您可以通过在 genador 字段定义中设置选项选项来实现。您指定的选项无效,因为 genador 是外键字段,因此需要对 Jugador 实例的引用。 “Jugador A”只是一个字符串而不是 Jugador 实例。
您可以根据需要在表单中使用查询集 (docs) 在表单中实现 modelchoicefield
,而不是限制模型中的选择。
【讨论】:
以上是关于如果这个 django 表单本身也生成选项,为啥它不接受我的输入?的主要内容,如果未能解决你的问题,请参考以下文章