我目前正在写一个网络博客,学习django。我需要一个视图来显示单个博客帖子,我的第一次尝试是为它创建一个url,如下所示:
myblog.com/blog/view/1它使用blog-id来标识指定的blog-post。
现在,如果你查看许多博客/网站,你会发现它们在url中使用了博客帖子的标题,这是因为这对搜索引擎更友好,所以更容易找到。这可能看起来像这样。
myblog.com/blog/view/a-python-backup-script如何在django中实现这一点?
奖励问题:很多网站还包括帖子的月份和年份。我猜这也和SEO有关,但这到底有什么用呢?
发布于 2012-08-09 16:38:57
在你的博客模型中添加一个slug字段。
from django.template.defaultfilters import slugify
Class Blog(models.Model):
title = models.CharField(max_length=40)
slug = models.SlugField(_('slug'), max_length=60, blank=True)
#Then override models save method:
def save(self, *args, **kwargs):
if not self.id:
#Only set the slug when the object is created.
self.slug = slugify(self.title) #Or whatever you want the slug to use
super(Blog, self).save(*args, **kwargs)在你的urls.py中
(r'^blog/view/(?P<slug>[-\w]+)/$', 'app.views.blog_view'),在views.py中
def blog_view(request, slug):
blog = Blog.objects.get(slug=slug)
#Then do whatever you wantEDIT:我在save方法中添加了一个检查,因为您希望在创建对象时创建slug。它不应该每次都被保存。
发布于 2012-08-09 16:35:42
确保您的模型确实有一个slug字段:
class BlogPost(models.Model):
slug = models.SlugField(unique=True)并且你有一个视角:
from django.shortcuts import get_object_or_404
def blog_detail(request, slug):
...
post = get_object_or_404(BlogPost, slug=slug)
...
render(request, "blog/blog_post.detail.html", { 'blog_post' : post })然后在您的urls.py中,您可以指定一个插件:
url(r'^(?P<slug>[-w]+)/$', 'blog.views.blog_detail', {}, name="blog_detail"),第一个参数是一个正则表达式,当匹配时,它将运行视图blog_detail视图,并将匹配的slug组从正则表达式传递到w视图(这将依次呈现并返回一个模板)
关于你的最后一点:我发现在搜索引擎优化方面有可能是积极的,在url中有日期让我更容易一眼看到博客帖子是不是新的。此外,在Django中,将此方法与date-based generic views一起使用非常容易,这将减少您需要编写的样板视图代码量。这将是一个示例:
url(r'(?P<year>d{4})/(?P<month>[a-z]{3})/(?P<day>w{1,2})/(?P<slug>[-w]+)/$',
'django.views.generic.date_based.object_detail',
{ template_name = "blog/detail.html", ... },
name="blog_detail"),发布于 2012-08-09 16:57:31
或者,如果你使用的是基于类的视图,你能做的最基本的事情是:
from django.views.generic import DetailView
from models import Blog
class BlogView(DetailView):
model = Blog
template_name = "blog/blog_detail.html"然后,url看起来像这样:
from views import BlogView
url(r'^(?P<slug>[-w]+)/$', BlogView._as_view(), name="blog_detail"),请注意,Django的通用DetailView需要pk或slug。因此,在这种情况下使用slug与使用pk没有什么不同。
https://stackoverflow.com/questions/11879416
复制相似问题