我遵循了基本的民意测验教程,并试图对其进行修改,使其适用于蛞蝓,但它不起作用。我从我的观点出发.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'),
在我看来。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'),
这是我的型号.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
这是我的管理员.py
from django.contrib import admin
from .models import Article
@admin.register(Article)
class ArticleAdmin(admin.ModelAdmin):
prepopulated_fields = {"slug": ("title",)}
但它不起作用。如何在我的url 中显示slugs
在视图中,需要传递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)
如果使用admin创建Articles
,则slug
将使用title
字段进行预填充。但是,如果您想创建一个article
,而不是在管理中创建,则需要在模型的save()
中显式调用slugify()
函数,并在保存之前将其分配给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()
注意:由于detail
视图使用的是slug
而不是id
,这意味着没有两篇文章应该具有相同的slug
,即相同的title
。在模型中添加unique=True
约束来处理此问题。
get_object_or_404
中缺少参数名称。假设您的Article
模型有一个名为slug
:的SlugField
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)
复制自此答案。请注意我们是如何重写save方法来自动生成段塞的根据您的体系结构,这可能不是一个好主意。我建议在视图或模型形式中调用slugify
,如本教程中所述。