django中的漂亮和seo友好的网址

Luk*_*uke 11 django url seo

我正在写一个网络博客,学习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.它不应该每次都保存.

  • 如果两个博客文章标题相同怎么办? (2认同)

Tim*_*ony 8

确保您的模型实际上有一个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)