如何在通用视图的URL中使用slug?

时间:2018-05-13 20:12:38

标签: python django django-views

如何查看单个文章的标题如下:news/article_name

我设法使用数字(<int:pk>在网址中,然后使用{% url 'article' article.id %}在模板中访问它),因此news/1实际上有效。而不是使用数字我想使用标题而无法弄清楚如何。

models.py

class Article(models.Model):
headline = models.CharField(max_length=200)
date_created = models.DateTimeField(auto_now_add=True)
date_updated = models.DateTimeField(auto_now=True)
author = models.ForeignKey(User, on_delete=models.CASCADE)
content = models.TextField()

def __str__(self):
    return self.headline

urls.py

path('<slug:headline>/', views.DetailView.as_view(), name='article'),

views.py

class ArticleView(generic.DetailView):
    model = Article
    template_name = 'news/index.html'
    context_object_name = 'article'
    local_context = {**context, **{'show_comments':False}}

文章模板中的某处

<p><a href="{% url 'article' %}">Read more</a></p>

2 个答案:

答案 0 :(得分:1)

使用主键时,必须将其包含在URL标记中。

{% url 'article' article.id %}

以同样的方式,您必须在URL标记中包含标题。

{% url 'article' article.headline %}

请注意,最好包含单独的slug field而不是headline,这样您就可以获得/news/man-bites-dog而不是/news/Man%20Bites%20Dog

这样的网址
class Article(models.Model):
    headline = models.CharField(max_length=200)
    slug = models.SlugField()

然后您将url标记更改为:

{% url 'article' article.slug %}

答案 1 :(得分:0)

你的slug应该是SlugField()。您可以使用实用程序slugify()根据标题生成符合网址的字符串。

class Article(models.Model):
    headline = models.CharField(max_length=200)
    slug = models.SlugField(max_length=200)
    ... your other fields ...

    def save(self, *args, **kwargs):
        if not self.slug:
            self.slug = slugify(self.headline)
        super(Article, self).save(*args, **kwargs)