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"),
]
Вернуться на верх