我已经关注了basic polls tutorial,我试图修改它以使其适用于slug但它不起作用。我在views.py
中离开了这个def detail(request, article_id):
details = "blog/detail.html"
context = {
"article": get_object_or_404(Article, pk=article_id)
}
return render(request, details, context)
和
url(r'^(?P<article_id>[0-9]+)/$', views.detail, name='detail'),
在我的views.py
中def detail(request, slug):
details = "blog/detail.html"
context = {
"article": get_object_or_404(Article, slug)
}
return render(request, details, context)
和
url(r'^(?P<slug>[\w-]+)/$', views.detail, name='detail'),
这是我的models.py
from django.db import models
from django.contrib.auth.models import User
class Article(models.Model):
author = models.ForeignKey(User)
title = models.CharField(max_length=250)
slug = models.SlugField()
body = models.TextField()
created = models.DateTimeField(auto_now=True)
def __str__(self):
return self.title
这是我的admin.py
from django.contrib import admin
from .models import Article
@admin.register(Article)
class ArticleAdmin(admin.ModelAdmin):
prepopulated_fields = {"slug": ("title",)}
但它没有用。如何让slu to显示在我的网址中
答案 0 :(得分:5)
在您的视图中,您需要传递slug
参数。
def detail(request, slug):
details = "blog/detail.html"
context = {
"article": get_object_or_404(Article, slug=slug) # pass slug
}
return render(request, details, context)
如果您使用管理员创建Articles
,则slug
将使用title
字段预先填充。但是,如果您要创建article
而不是在管理员中执行此操作,则需要在模型save()
中明确调用slugify()
函数并将其分配给{{ 1}}保存之前的对象。
您可以执行以下操作:
article
注意:由于您使用class Article(models.Model):
def save(self, *args, **kwargs):
self.slug = slugify(self.title) # set the slug explicitly
super(Article, self).save(*args, **kwargs) # call Django's save()
代替slug
进行id
观看,这意味着没有2篇文章应该具有相同的detail
即相同的slug
。在模型中添加title
约束以处理此问题。
答案 1 :(得分:1)
您在get_object_or_404
中缺少参数名称。假设您的Article
模型的SlugField
名为slug
:
get_object_or_404(Article, slug=slug)
编辑:用户更新提供模型的问题。不再需要这部分。
由于您没有发布Article
模型,我将提供一个示例,说明您应该如何对其进行编码以使其与我的示例兼容:
from django.utils.text import slugify
from django.db import models
class Article(models.model):
#…
slug = models.SlugField(unique=True)
def save(self, *args, **kwargs):
self.slug = slugify(self.slug)
super(Article, self).save(*args, **kwargs)
从this回复复制。注意我们如何覆盖save方法以自动生成slug。 可能不是一个好主意取决于您的架构。我建议您在this教程中的视图或模型中调用slugify
。