如何查看单个文章的标题如下: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>
答案 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)