【问题标题】:django model field in urlurl中的django模型字段
【发布时间】:2017-10-24 10:54:56
【问题描述】:

我学习 django 已经有一点时间了,但是我已经把自己搞砸了。两天来我一直在寻找答案,令人讨厌的是,我想我在某个阶段偶然发现了它,但直到后来我才意识到我忘记更改模板(那时我忘记了我阅读的帖子,所以我可以重新创建它)。

我正在尝试创建一些用户可以注册的东西,然后创建一个“频道”来存储他们的东西。我让它工作得很好,但现在我想让它看起来更好(比如 Github 或 youtube)。

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

这是我目前所拥有的:

网址:

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

(注意:当 slug 更改为 (?P&lt; pk &gt;[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 运行“名称”字段,然后在 HTML 模板中调用它而不是 channel.id

【问题讨论】:

  • 您应该存储一个单独的 slug 字段,该字段会根据名称自动填充。

标签: django django-models django-urls


【解决方案1】:

让详细视图知道您正在使用 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/

【讨论】:

  • 非常感谢!花了一段时间,但我解决了这个问题。我需要将 view.py 中的 slug_field 更改为“slug”字段而不是名称,然后在 HTML 模板中调用 channels.slug。
猜你喜欢
  • 2019-12-24
  • 1970-01-01
  • 2013-02-03
  • 1970-01-01
  • 2012-05-13
  • 1970-01-01
  • 1970-01-01
  • 2011-06-22
  • 2017-10-04
相关资源
最近更新 更多