首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >django中漂亮且对seo友好的urls

django中漂亮且对seo友好的urls
EN

Stack Overflow用户
提问于 2012-08-09 16:25:35
回答 5查看 8.2K关注 0票数 12

我目前正在写一个网络博客,学习django。我需要一个视图来显示单个博客帖子,我的第一次尝试是为它创建一个url,如下所示:

代码语言:javascript
复制
myblog.com/blog/view/1

它使用blog-id来标识指定的blog-post。

现在,如果你查看许多博客/网站,你会发现它们在url中使用了博客帖子的标题,这是因为这对搜索引擎更友好,所以更容易找到。这可能看起来像这样。

代码语言:javascript
复制
myblog.com/blog/view/a-python-backup-script

如何在django中实现这一点?

奖励问题:很多网站还包括帖子的月份和年份。我猜这也和SEO有关,但这到底有什么用呢?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-08-09 16:38:57

在你的博客模型中添加一个slug字段。

代码语言:javascript
复制
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中

代码语言:javascript
复制
(r'^blog/view/(?P<slug>[-\w]+)/$', 'app.views.blog_view'),

在views.py中

代码语言:javascript
复制
def blog_view(request, slug):
    blog = Blog.objects.get(slug=slug)
    #Then do whatever you want

EDIT:我在save方法中添加了一个检查,因为您希望在创建对象时创建slug。它不应该每次都被保存。

票数 27
EN

Stack Overflow用户

发布于 2012-08-09 16:35:42

确保您的模型确实有一个slug字段:

代码语言:javascript
复制
class BlogPost(models.Model):
    slug = models.SlugField(unique=True)

并且你有一个视角:

代码语言:javascript
复制
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中,您可以指定一个插件:

代码语言:javascript
复制
url(r'^(?P<slug>[-w]+)/$', 'blog.views.blog_detail', {}, name="blog_detail"),

第一个参数是一个正则表达式,当匹配时,它将运行视图blog_detail视图,并将匹配的slug组从正则表达式传递到w视图(这将依次呈现并返回一个模板)

关于你的最后一点:我发现在搜索引擎优化方面有可能是积极的,在url中有日期让我更容易一眼看到博客帖子是不是新的。此外,在Django中,将此方法与date-based generic views一起使用非常容易,这将减少您需要编写的样板视图代码量。这将是一个示例:

代码语言:javascript
复制
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"),
票数 8
EN

Stack Overflow用户

发布于 2012-08-09 16:57:31

或者,如果你使用的是基于类的视图,你能做的最基本的事情是:

代码语言:javascript
复制
from django.views.generic import DetailView
from models import Blog

class BlogView(DetailView):
    model = Blog
    template_name = "blog/blog_detail.html"

然后,url看起来像这样:

代码语言:javascript
复制
from views import BlogView

url(r'^(?P<slug>[-w]+)/$', BlogView._as_view(), name="blog_detail"),

请注意,Django的通用DetailView需要pk或slug。因此,在这种情况下使用slug与使用pk没有什么不同。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11879416

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档