Django: Как связать шаблонную форму с каждым объектом списка и использовать конкретный запрос для удаления объекта из списка?
У меня есть поле ManyToMany под названием available_player
в модели League
, которое содержит всех игроков в бейсбольной лиге. В моем шаблоне draft.html
я использую цикл for
для перечисления каждого игрока, а также драфт button
рядом с каждым. Я пытаюсь создать фэнтезийную бейсбольную лигу, поэтому, когда игрок задрафтован и форма отправлена, конкретный игрок должен быть удален из available_players
.
(Список available_players
берется из модели Player
, в которой есть все имена игроков, их позиции и команды).
models.py:
class Player(models.Model):
name = models.CharField(max_length=255)
position = models.CharField(max_length=255)
team = models.CharField(max_length=255)
def __str__(self):
return self.name
class League(models.Model):
title = models.CharField(max_length=25)
conference = models.CharField(max_length=255, choices=CONF_CHOICES, default='south')
created_by = models.ForeignKey(User, on_delete=models.CASCADE)
members = models.ManyToManyField(User, related_name='members')
draft_date_and_time = models.DateTimeField(auto_now_add=False, blank=True, null=True, help_text='YYYY-MM-DD hh:mm (24 hour time)')
available_player = models.ManyToManyField(Player)
def __str__(self):
return self.title
draft.html:
{% for player in players %}
<div class="row mb-5 pt-4 pb-3 border border-success rounded-lg" style="background-color: rgb(70,70,70);">
<div class="col">
<div class="row">
<div class="col">
{{ player.team}}
</div>
<div class="col">
{{ player }}
</div>
<div class="col">
{{ player.position }}
</div>
</div>
</div>
</div>
<div class="col text-right">
<button class="button is-info">Add to pending</button>
<form method="post" action=".">
{% csrf_token %}
<!--Need each button to relate to a specific player in views.py-->
<button class="button is-success">Draft</button>
</form>
</div>
</div>
{% endfor %}
views.py:
def draft(request, league_id, league_title):
south_conf = ['Chemeketa','Clackamas','Clark','Lane','Linn-Benton','Mt Hood','SW Oregon','Umpqua']
league = League.objects.get(id=league_id)
players = Player.objects.all()
if request.method == 'POST': # Receive post request from template and delete specific player from League.available_player
league = League.objects.get(id=league_id)
for player in league.available_player.all():
print(player)
context = {'league': league, 'players': players, 'south_conf': south_conf}
return render(request, 'league/draft.html', context)
Я думаю, что этого можно достичь, если дать каждому form
в цикле for определенный id, относящийся к игроку, но я не могу понять, как это сделать.
Я сделал словарь 'players' в представлении 'draft', который передается в контекст шаблона. Цикл в шаблоне создает кнопки на основе этого словаря, со значением на каждой итерации: value={{player}}. Результат возвращается в то же представление. В котором, в зависимости от того, какая кнопка нажата, результат выводится на печать:
print(request.POST.get('bbb'))
В строке 'bboard/draft.html' замените bboard на название вашей папки, в которой находятся шаблоны. У меня это templates/bboard.
views.py
def draft(request):
if request.method == "POST":
print(request.POST.get('bbb'))
context = {'players': [1, 2, 3, 4, 5]}
return render(request, 'bboard/draft.html', context)
templates(draft.html)
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
</head>
<body>
<h2>Your form</h2>
<form method="post" action="{% url 'draft'%}">
{% csrf_token %}
{% for player in players %}
<button class="button is-success" name='bbb' value={{ player }}>player {{ player }}</button><br>
{% endfor %}
</form>
</body>
</html>
urls.py
urlpatterns = [
path("draft/", draft, name="draft"),
]