【问题标题】:Creating a Path Based on Multiple SlugFields in Django在 Django 中创建基于多个 SlugField 的路径
【发布时间】:2019-06-06 12:51:57
【问题描述】:

我有一个 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 是否可以使用它。有没有办法创建一个允许用户去委员会的路径?我想过创建一个函数来测试锦标赛是否存在,但不确定具体如何。有小费吗?我所需要的只是一个可行的解决方案。

【问题讨论】:

  • Django 绝对可以在 url 中有多个 slug。 this 是你要找的吗?

标签: python django python-3.x django-models slug


【解决方案1】:

我不知道你为什么认为你不能有两个蛞蝓。你可以:

urlpatterns = [
    path('<slug:slug>/', views.tournament_detail_view),
    path('<slug:tournament_slug>/<slug:committee_slug>/', views. committee_detail_view),
]

现在你的 Committee_detail_view 变成了:

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})

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-17
    • 2020-04-23
    • 2018-07-04
    • 2021-03-25
    • 2012-05-01
    • 1970-01-01
    • 2021-03-23
    相关资源
    最近更新 更多