我遵循了基础民意测验指南,并且尝试对其进行修改以使其适用于子弹,但它不起作用。我从我的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[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[\w-]+)/$', views.detail, name='detail'),
这是我的模型
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",)}
但它不起作用。我如何让sl显示在我的网址中
在您看来,您需要传递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
使用admin 进行创建,则将slug
使用title
字段预先填充。但是,如果要创建一个article
比在admin中执行的其他操作,则需要slugify()
在模型中显式调用函数save()
并将其分配给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
用于detail
视图,因此这意味着2篇文章不应具有相同的内容,slug
即same title
。unique=True
在模型中添加约束以处理此问题。