如果这个 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 表单本身也生成选项,为啥它不接受我的输入?的主要内容,如果未能解决你的问题,请参考以下文章

表单字段的 Django 跳过选项

为啥 django 模型的空白和空值不同的选项?

为啥 django 模型的空白和空值不同的选项?

Django本身提供了runserver,为啥不用来部署

Django 1.11 中表单渲染性能不佳

Django:如何包含模型表单?