У меня есть проект Django, основанный на создании турниров и вложении в них определенных объектов. Например, каждый турнир имеет несколько комитетов. Когда кто-то создает турнир, я разрешаю ему создать ссылку с SlugField
. Мой код (пока) выглядит следующим образом:
models.py
from django.db import models
from django.utils.text import slugify
class Tournament(models.Model):
name = models.CharField(max_length=50)
slug = models.SlugField(max_length=50, unique=True)
def _get_unique_slug(self):
'''
In this method a unique slug is created
'''
slug = slugify(self.name)
unique_slug = slug
num = 1
while Tournament.objects.filter(slug=unique_slug).exists():
unique_slug = '{}-{}'.format(slug, num)
num += 1
return unique_slug
def save(self, *args, **kwargs):
if not self.slug:
self.slug = self._get_unique_slug()
super().save(*args, **kwargs)
class Committee(models.Model):
name = models.CharField(max_length=100)
belongsTo = models.ForeignKey(Tournament, blank=True, null=True)
slug = models.SlugField(max_length=50, unique=True)
def _get_unique_slug(self):
'''
In this method a unique slug is created
'''
slug = slugify(self.name)
unique_slug = slug
num = 1
while Committee.objects.filter(slug=unique_slug).exists():
unique_slug = '{}-{}'.format(slug, num)
num += 1
return unique_slug
def save(self, *args, **kwargs):
if not self.slug:
self.slug = self._get_unique_slug()
super().save(*args, **kwargs)
views.py
from django.shortcuts import render, get_object_or_404
from .models import Tournament, Committee
def tournament_detail_view(request, slug):
tournament = get_object_or_404(Tournament, slug=slug)
return render(request, 'tournament/detail.html', {'tournament': tournament})
def committee_detail_view(request, slug):
committee = get_object_or_404(Committee, slug=slug)
return render(request, 'committee/detail.html', {'committee': committee})
urls.py
from . import views
from django.urls import path
app_name = 'tournament'
urlpatterns = [
path('<slug:slug>/', views.tournament_detail_view),
]
Мой вопрос касается urls.py
. Если пользователь создает турнир под названием «Zavala», он может получить доступ к веб-сайту по номеру example.com/zavala
. Однако, если они создадут комитет под названием «Cayde» в рамках указанного турнира, у них не будет возможности получить доступ к комитету на example.com/zavala/cayde
. Проблема в том, что оба под-адреса являются слизнями, и я не уверен, что Django может работать с этим. Есть ли способ создать путь, который позволяет пользователю идти в комитет? Я думал что-то вроде создания функции для проверки существования турнира или нет, но точно не знал, как именно. Какие-нибудь советы? Все, что мне нужно, это рабочее решение.