首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Django中基于多个SlugFields创建路径

在Django中基于多个SlugFields创建路径
EN

Stack Overflow用户
提问于 2019-01-11 15:13:42
回答 1查看 347关注 0票数 0

我有一个Django项目,其基础是创建锦标赛,并在其中嵌套特定的对象。例如,每场比赛都有多个委员会。当有人创建一个锦标赛时,我允许他们创建一个SlugField链接。我的代码(到目前为止)如下:

models.py

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
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的委员会。问题是,这两个子urls都是子弹,我不确定Django是否能处理这个问题。是否有一种方法可以创建一条允许用户进入委员会的路径?我想了一些类似于创建一个函数来测试比赛是否存在的东西,但不确定到底是如何存在的。有小费吗?我只需要一个可行的解决方案。

EN

回答 1

Stack Overflow用户

发布于 2019-01-11 15:32:45

我不知道你为什么认为你不能有两个鼻涕虫。您可以:

代码语言:javascript
运行
复制
urlpatterns = [
    path('<slug:slug>/', views.tournament_detail_view),
    path('<slug:tournament_slug>/<slug:committee_slug>/', views. committee_detail_view),
]

现在,您的committee_detail_view变成:

代码语言:javascript
运行
复制
def committee_detail_view(request, tournament_slug, committee_slug): 
    committee = get_object_or_404(Committee, slug=committee_slug, belongsTo__slug=tournament_slug)    
    return render(request, 'committee/detail.html', {'committee': committee})
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54149237

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档