Почему эта форма 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).