Вопрос по 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())