url 中的 django 模型字段

django model field in url

我学习 django 已经有一段时间了,但我已经 运行 自己对这个有所了解。两天来我一直在寻找答案,令人恼火的是,我想我在某个阶段偶然发现了它,但直到后来我才意识到我忘记更改模板(到那时我忘记了 post 我阅读以便我可以重新创建它)。

我正在尝试创建一些用户可以注册的东西,然后创建一个 "channel" 来存储他们的东西。我的工作正常,但现在我想使 URL 看起来更好(例如 Github 或 youtube)。

我希望 URL 显示为 "example.com/channels/channel-name" 而不是 "example.com/channels/1"

这是我目前所拥有的:

url:

url(r'^(?P<slug>[\w-]+)/$', channel_views.DetailView.as_view(), name="channel-detail"),

(注意:当 slug 被更改为 (?P< pk >[0-9]+) 它有效)

观看次数:

class DetailView(generic.DetailView):
    model = Channel
    template_name = 'channels/channel-detail.html'

型号

class Channel(models.Model):
    name = models.CharField(max_length=50)
    description = models.TextField(max_length=150)
    def get_absolute_url(self):
        return reverse('channels:channel-detail', kwargs={'slug':self.name})

index.html:

<a class="channel-link text-center" href="{% url 'channels:channel-detail' channel.id %}">{{channel.name}}</a>

我觉得我需要通过 slugify 运行 "name" 字段然后在 HTML 模板中调用它而不是 channel.id?

让详细视图知道您正在使用 slug 字段的名称

class DetailView(generic.DetailView):
    model = Channel
    template_name = 'channels/channel-detail.html'
    slug_field = 'name'

虽然它在预设中不是唯一的,但可能会给您带来麻烦。

更好的方法是添加一个额外的 slug 字段,并按照您的建议通过 slugify 用 运行 名称填充它,并确保它是唯一的。

查看此处的 get_object() 方法,了解如何使用主键或 slug 选择对象:

http://ccbv.co.uk/projects/Django/1.11/django.views.generic.detail/DetailView/