Помощь с Django models/view/form

Добрый день stackoverflow'цы. Хотел бы у вас спросить помощи. Изучаю в данный момент Django и делаю сайт с блоком новостей, пользователями и турнирами. В данный момент сделал новости без проблем, создание турниров и пользователей так же сделал. У вас хотел бы спросить помощи, может кто сможет помочь или накидать быстрый вариант возможности регистрации пользователя на турнир определенный. Сразу прошу не кидаться в меня помоями, т.к все начинали с нуля и любая ваша помощь это мешочек знаний в мой ларец с уже существующими знаниями.

Пример:

  1. Есть турнир и лист турниров (сделано)
  2. Можно зайти на его страницу узнать все подробности турнира(сделано)
  3. На странице турнира есть кнопка "Зарегистрироваться", при нажатии на которую команда юзера попадает в список зарегистрированных команд(тут встали трудности)
  4. Вывод зарегистрированных команд в список на странице турнира.

3 пункт реализовал, но очень криво, решил вытаскивать у пользователя из профиля команду, и передавать ее в форму созданную специально для каждого турнира, в дальнейшем выводить на сайте, вроде криво косо на костылях работает, но при этом нужно, чтобы после нажатия и передачи инфы кнопка блочилась и нельзя было повторно нажать, 1 регистрация 1 команды на турнир определенный соответственно. Блочить не получается, не пойму как получать нормально список зарегистрированных команд, сейчас смотрю в сторону JS если с помощью него можно будет сделать все.

Реализовал примерно так.

** models.py **

class Tournaments(models.Model):
    name = models.CharField('Название турнира', max_length=50)
    description = models.TextField('Описание турнира')
    prize = models.TextField('Призовой')
    game = models.ForeignKey(
        Game, verbose_name='Дисциплина', null=True, on_delete=models.CASCADE
    )
    image = models.ImageField('Лого турнира', default='tournament.jpg')
    max_teams = models.PositiveSmallIntegerField('Максимальное количество команд', default=0)
    teams_count = models.PositiveSmallIntegerField('Количество команд', null=True, blank=True)
    teams = models.ManyToManyField(Team, blank=True)
    url = models.SlugField(unique=True, blank=True, null=True)

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

    def save(self, *args, **kwargs):
        self.url = slugify(self.name)
        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)
    # team = models.ForeignKey(Team, on_delete=models.SET_NULL, blank=True, null=True)
    team = models.CharField('Тима', max_length=50)
    user = models.ForeignKey(
        User, verbose_name='пользователь', on_delete=models.CASCADE, blank=True, null=True
    )

    def __str__(self):
        return f'{self.tournaments} - {self.team}'

** forms.py **

class TournamentsRegistrationForm(forms.ModelForm):
    class Meta:
        model = TournamentRegistration
        fields = {'user', 'team'}
class AddTournamentForm(forms.ModelForm):
    max_teams = forms.IntegerField(required=True)
    teams_count = forms.IntegerField(initial=0, widget=forms.HiddenInput)

    class Meta:
        model = Tournaments
        fields = [
            'name', 'description', 'image', 'prize', 'game', 'teams', 'max_teams', 'teams_count', 'url'
        ]
        widgets = {
            'name': TextInput(attrs={
                'placeholder': 'Название турнира'
            }),
            'description': TextInput(attrs={
                'placeholder': 'Описание турнира'
            }),
            'prize': Textarea(attrs={
                'placeholder': 'Призовой фонд',
            }),
            'game': Select(attrs={
                'placeholder': 'Игра',
            }),
            'teams': TextInput(attrs={
                'placeholder': 'команда'
            }),
            'teams_count': TextInput(attrs={
                'placeholder': 'кол-во команд'
            }),
        }

** tournaments_detail.html **

{% extends 'news/base.html' %}
{% load static %}
{% block title %} Добавить турнир {% endblock title %}

{% block content %}
    {{ tournaments.game }}<br>
    {{ tournaments.name }}<br>
    Количество команд: {{ tournaments.tournamentregistration_set.count }}/{{ tournaments.max_teams }}<br>
    {% for regteams in tournaments.get_tournament.all %}
        <a href="{% url 'team_detail' regteams.team %}">{{ regteams.team }}</a><br>
    {% endfor %}
    {{ tournaments.description|linebreaks }}<br>
    {{ tournaments.prize|linebreaks }}<br>
{#        /tournament_registration/#}
    <form action="{% url 'tournament_registration' tournaments.id %}" method="post">
        {% csrf_token %}
            <input type="hidden" name="tournament" id="" value="" class="tournamentId">
            <input type="hidden" name="user" id="" value="" class="regId">
            <label for="teams">
                Выберите команду
            </label><br>
            <select name="team" id="teams">
                <option>
                    {{ request.user.author.team.name }}
                </option>
            </select><br>
            {% if tournaments.tournamentregistration_set.count < tournaments.max_teams %}
            <button class="btn btn-outline-success" type="submit">Зарегестрироваться</button>
            {% elif request.user.author.role_id != 1 %}
                Необходимо быть капитаном, чтобы зарегестрировать команду!
            {% else %}
            <button class="btn btn-outline-success" type="submit" disabled>Зарегестрироваться</button>
            {% endif %}
    </form>
{% endblock content %}

При помощи regteams сделал кривой вывод список команд, которые уже зарегестрированы. Но при этом в блоке кнопки не сделать все это через for, даже представить боюсь, сколько будет кнопок Зарегестрироваться, если так пытаться блочить кнопку по команде, которая есть в этом списке, если совпадает название команды. Может кто сможет подсказать куда двигаться, как реализовать или исправить что уже существует. Возможно кто-то сможет в небольшое количество строк накидать рабочий код, чтобы посмотреть как работает, как реализуется, просто с моделями юзера, тимы, турнира и саму регистрацию. Может при помощи JS можно реализовать, если кто знает JS может поможет. Я только его начал учить, в связи с тем, что пришла мысль, о возможности реализации это на JS, но тут встал в тупик, т.к его не знаю.

Буду очень благодарен всем ответам и любой помощи!


Ответы (0 шт):