Вопрос по Django. Помощь в реализации регистрации на турнир

на данный момент такие модели существуют.

class Team(models.Model):
    name = models.CharField('Название', max_length=35, unique=True)
    tag = models.CharField('Тег', max_length=16, unique=True)
    about = models.TextField('О команду', max_length=500, null=True, blank=True)
    logo = models.ImageField('Лого', upload_to="teams_logo/", null=True)
    game = models.ForeignKey(
        Game, verbose_name='игра', on_delete=models.SET_NULL, null=True, blank=True
    )
    tournament = models.ManyToManyField('Tournaments', verbose_name='Турниры', blank=True)
    slug = models.SlugField(unique=True, blank=True, null=True)

    def __str__(self):
        return self.name

    def get_absolute_url(self):
        return reverse("team_detail", kwargs={"slug": self.slug})

    def save(self, *args, **kwargs):
        self.slug = slugify(self.name)
        super(Team, self).save(*args, **kwargs)

    class Meta:
        verbose_name = "Команда"
        verbose_name_plural = "Команды"

class Tournaments(models.Model):
    name = models.CharField('Название турнира', max_length=50)
    description = models.TextField('Описание турнира')
    prize = models.TextField('Призовой')
    game = models.ForeignKey(
        Game, verbose_name='Дисциплина', on_delete=models.CASCADE
    )
    author = models.ForeignKey(
        User, verbose_name='пользователь', on_delete=models.CASCADE, blank=True, null=True
    )
    teams = models.ManyToManyField(
        Team, verbose_name='Команда', blank=True
    )
    image = models.ImageField('Лого турнира')
    max_teams = models.PositiveSmallIntegerField('Максимальное количество команд', default=0)
    count_registration_teams = models.PositiveSmallIntegerField('Количество зарегестрированных команд', default=0)
    start_date = models.DateTimeField("Дата начала")
    start_registration_date = models.DateTimeField("Начало регистрации")
    end_registration_date = models.DateTimeField("Конец регистрации")
    slug = models.SlugField(unique=True, blank=True, null=True)
    status = models.BooleanField('Статус активности', default=False)

    def __str__(self):
        return self.name

    def get_absolute_url(self):
        return reverse("tournament_detail", kwargs={"slug": self.slug})

    def save(self, *args, **kwargs):
        self.slug = slugify(f'{self.name} - {self.game}')
        super(Tournaments, self).save(*args, **kwargs)

    def get_tournament(self):
        return self.tournamentregistration_set

    class Meta:
        verbose_name = "Турнир"
        verbose_name_plural = "Турниры"


class TournamentRegistration(models.Model):
    tournaments = models.ForeignKey(Tournaments, on_delete=models.CASCADE)
    teams = models.ForeignKey(Team, on_delete=models.CASCADE, null=True, blank=True)
    user = models.ForeignKey(
        User, verbose_name='пользователь', on_delete=models.CASCADE, blank=True, null=True
    )

Я не знаю, требуется ли здесь вообще регистрация на турнир .

И эти взгляды присутствуют.

class TournamentsRegistration(LoginRequiredMixin, View):

    def post(self, request, pk, *args, **kwargs):
        print(f'TYT ----> {request.POST} & {request.GET}<----')
        form = TournamentsRegistrationForm(request.POST or None)
        tournaments = Tournaments.objects.get(id=pk)
        if form.is_valid():
            print("OK")
            form.save(commit=False)
            form.tournaments = tournaments
            form.teams = request.user.profile.team
            form.tournaments.count_registraion_teams += 1
            form.save()
        else:
            print('НЕВЕРНАЯ ФОРМА')
            print(form.errors)
            print(form.non_field_errors())
        return redirect(tournaments.get_absolute_url())

И формы.

class TournamentsRegistrationForm(forms.ModelForm):

    class Meta:
        model = TournamentRegistration
        fields = {'tournaments', 'teams', 'user'}

Следующий html.

<div class="registered_teams">
  <div class="registered_teams">
    {{ tournaments.count_registration_teams }} / {{ tournaments.max_teams }}<br>
  </div>
  <div class="tournament-registration">
    <form action="{% url 'tournament_registration' tournaments.id %}" method="post">
      {% csrf_token %}
      <button type="submit">Зарегестрироваться</button>
    </form>
  </div>
</div>

Необходимо следующее, по нажатию кнопки регистрации команда капитана добавлялась в турнир, а турнир добавлялся в команду, для этого я использовал M2M связь, также необходимо чтобы счетчик зарегистрированных команд увеличивался на единицу( также желательно выводить название зарегистрированных команд на странице) и чтобы кнопка регистрации блокировалась для команды которая уже зарегистрирована на этот турнир, но это скорее всего я смогу сделать сам. Но мне кажется, что здесь нужно работать с Tournaments и без forms.py. Возможно, кто-то может предложить решение. До этого я мог использовать только JS для увеличения счетчика команд и блокировки кнопки, но это никак не добавляется в базу данных, а только визуально отображается на странице турнира, без привязки TOURNAMENT-TEAMS\TEAM-TOURNAMENT. Если потребуется дополнительная информация, я предоставлю ее здесь.

Заранее благодарю за любую помощь или подсказку в каком направлении мне стоит думать!

Прежде всего: лучше всего давать вашим моделям имена в единственном числе (Tournament вместо Tournaments).

Во-вторых, наилучшей практикой является указание related_name в поле ManyToManyField: tournament = models.ManyToManyField('Tournament', ..., related_name='teams'). Обратите внимание, что это множественное число.

И последнее, я бы не стал вести учет количества команд как отдельное поле в Турнире. Вы можете просто рассчитать его на месте, когда вам это понадобится.

t = Tournament.objects.get(id=1)
print(t.teams.count())
Вернуться на верх