Почему эта форма django не принимает мой ввод, если она также сама генерирует опции?

Это менеджер соревнований, который сопоставляет участников соревнований случайным образом, я называю эти пары играми. Игра представляет собой модель django с атрибутом "ganador" для хранения победителя игры. Для выбора победителя я использую modelform_factory под названием formaGanador и исключаю все атрибуты модели, кроме атрибута "ganador". Атрибут "ganador" имеет опцию "choices", так что форма позволяет выбрать только одного из участников этой игры, но не участников других игр. Наконец, когда я выбираю участника из списка и нажимаю кнопку submit на форме, я получаю следующий ответ: Выберите правильный вариант. Игрок А не является одним из доступных вариантов.

model for games in 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 %}

извините за переменные в испанском языке.

Django не генерирует опции самостоятельно. Вы делаете это, устанавливая опцию choices в определении поля genador. Опции, которые вы указываете, недействительны, потому что genador - это поле внешнего ключа и, следовательно, требует ссылки на экземпляр Jugador. "Jugador A" - это просто строка, а не экземпляр Jugador

Вместо того, чтобы ограничивать выбор в вашей модели, вы можете реализовать modelchoicefield в вашей форме с набором запросов по мере необходимости (docs).

Вернуться на верх