使用Django动态创建新的URL /页面

时间:2019-01-08 05:28:14

标签: django dynamic web-applications

我正在开发一个程序,该程序允许用户创建页面来监视和管理可能在其高中和大学中进行的比赛,特别是MUN和取证比赛。每当用户登录时,他或她都可以选择创建一个新的锦标赛,这应该为他们创建一个新的URL和基本网页,以便他们可以根据自己的喜好编辑该锦标赛。例如,如果用户创建了一个名为“ Hello World”的锦标赛,那么我希望能够使他们成为可以访问example.com/helloworld的页面。是否有内置的Django函数可以帮助解决此类问题?

1 个答案:

答案 0 :(得分:1)

您可以在此处使用slug设置通用的网址格式:

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)

urls.py

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

views.py

def tournament_detail_view(request, slug):
    tournament = get_object_or_404(Tournament, slug=slug)    
    return render(request, 'tournament/detail.html', {'tournament': tournament})

这就是我们拥有的:当用户创建一个名称为Tournament的新Hello World时,其网址为example.com/hello-world

对于名称为New Tournament的锦标赛,它的网址为example.com/new-tournament。等等