我正在写一个网络博客,学习django.我需要一个视图来显示一个博客帖子,我的第一个尝试是为它创建一个URL,如下所示:
myblog.com/blog/view/1
Run Code Online (Sandbox Code Playgroud)
这使用blog-id来标识指定的博客帖子.
现在,如果你看一下很多博客/网站,你会看到他们在网址中使用博客帖子的标题,这是因为这对搜索引擎更友好,因此可以更容易找到.这可能看起来像这样.
myblog.com/blog/view/a-python-backup-script
Run Code Online (Sandbox Code Playgroud)
我如何在django中实现这个?
奖金问题:许多网站还包括帖子的月份和年份.我想这也与SEO有关,但这究竟有用吗?
Mik*_*ael 26
在您的Blog模型中添加一个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)
Run Code Online (Sandbox Code Playgroud)
在你的urls.py中
(r'^blog/view/(?P<slug>[-\w]+)/$', 'app.views.blog_view'),
Run Code Online (Sandbox Code Playgroud)
在views.py中
def blog_view(request, slug):
blog = Blog.objects.get(slug=slug)
#Then do whatever you want
Run Code Online (Sandbox Code Playgroud)
编辑:我在save方法中添加了一个检查,因为您希望在创建对象时创建slug.它不应该每次都保存.
确保您的模型实际上有一个slug字段:
class BlogPost(models.Model):
slug = models.SlugField(unique=True)
Run Code Online (Sandbox Code Playgroud)
并且你有一个观点:
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 })
Run Code Online (Sandbox Code Playgroud)
然后在你的urls.py中,你可以指定一个slug:
url(r'^(?P<slug>[-w]+)/$', 'blog.views.blog_detail', {}, name="blog_detail"),
Run Code Online (Sandbox Code Playgroud)
第一个参数是一个正则表达式,当匹配时,将运行视图blog_detail 视图并将匹配的slug组从正则表达式传递给thew视图(它将依次呈现并返回模板)
关于你的最后一点:我发现在SEO方面也可能是积极的,在网址中设置日期可以让我更容易看到博客文章是否一目了然.此外,在Django中,使用这种方法以及基于日期的通用视图非常容易,这将减少您需要编写的样板视图代码的数量.这将是一个例子:
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"),
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7118 次 |
| 最近记录: |