Помощь с Django models/view/form
Добрый день stackoverflow'цы. Хотел бы у вас спросить помощи. Изучаю в данный момент Django и делаю сайт с блоком новостей, пользователями и турнирами. В данный момент сделал новости без проблем, создание турниров и пользователей так же сделал. У вас хотел бы спросить помощи, может кто сможет помочь или накидать быстрый вариант возможности регистрации пользователя на турнир определенный. Сразу прошу не кидаться в меня помоями, т.к все начинали с нуля и любая ваша помощь это мешочек знаний в мой ларец с уже существующими знаниями.
Пример:
- Есть турнир и лист турниров (сделано)
- Можно зайти на его страницу узнать все подробности турнира(сделано)
- На странице турнира есть кнопка "Зарегистрироваться", при нажатии на которую команда юзера попадает в список зарегистрированных команд(тут встали трудности)
- Вывод зарегистрированных команд в список на странице турнира.
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, но тут встал в тупик, т.к его не знаю.
Буду очень благодарен всем ответам и любой помощи!