12

私は現在、django を学習しながら Web ブログを書いています。単一のブログ投稿を表示するビューが必要で、最初の試みは次のような URL を作成することでした。

myblog.com/blog/view/1

これは、ブログ ID を使用して、指定されたブログ投稿を識別します。

多くのブログ/ウェブサイトを見ると、URL にブログ投稿のタイトルが使用されていることがわかります。これは、これがより検索エンジンに適しているためであり、簡単に見つけることができます。これはこのように見えるかもしれません。

myblog.com/blog/view/a-python-backup-script

これをdjangoで実装するにはどうすればよいですか?

おまけの質問: 多くのサイトには、投稿の月と年も含まれています。これはSEOにも関係していると思いますが、具体的にはどのように役立つのでしょうか?

4

5 に答える 5

27

ブログ モデルにスラッグ フィールドを追加します。

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 want

編集:オブジェクトの作成時にスラッグを作成する必要があるため、save メソッドにチェックを追加しました。毎回保存する必要はありません。

于 2012-08-09T08:38:56.697 に答える
8

モデルに実際にスラッグ フィールドがあることを確認します。

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 view を実行し、一致したslugグループを正規表現から thew ビューに渡します (レンダリングしてテンプレートを返します)。

最後のポイントについて: URL に日付を含めると、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"),
于 2012-08-09T08:35:42.023 に答える
2

または、クラスベースのビューを使用している場合、最も基本的なことは次のとおりです。

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 を使用することと同じです。

于 2012-08-09T08:57:30.783 に答える
2

この同様の方法は、数値 ID フィールドを使用する URL と下位互換性があります。

models.pyにスラッグ フィールド保存定義を追加します。

from django.template.defaultfilters import slugify

slug = models.SlugField(default='no-slug', max_length=60, blank=True)

def save(self, *args, **kwargs):
    #save a slug if there is no slug or when it's 'no-slug' (the default slug)
    if not self.slug or self.slug == 'no-slug':
        self.slug = slugify(self.name)
    super(Project, self).save(*args, **kwargs)

urls.pyに 2 つ目のURL パターンを追加します。

#original:
url(r'^(?P<id>\d+)/$', 'project.views.view', name='view_url'),
#new pattern added under original:
url(r'^(?P<id>\d+)-(?P<slug>[-\w\d]+)/$', 'project.views.view', name='view_url'),

views.py でスラッグを通過させます:

def view(request, mid=None, slug=None):

次に、この URLパターンを使用するために必要なことは、models.py を編集することだけです。

def get_absolute_url(self):
    return reverse('view_url', args=[self.id, self.slug])
于 2015-03-09T19:04:31.480 に答える
0

django-autoslugはこの目的にうまく機能し、多くの便利なオプションがあります。

于 2014-10-15T14:49:52.343 に答える