0

Djangoでウェブログサイトを作成しています。私はこのようなブログモデルを持っています:

class Blog(models.Model):
    name = models.CharField(max_length=255)
    slug = models.SlugField(max_length=255)
    ...

そして、各ブログのフロントページを次のようなURLに配置したいと思います:www.example.com/blog-slug/

ただし、Flatpagesも使用しているので、次のようなURLと一致させることができます:www.example.com/flat-page/

したがって、このようなurlpatternsは機能しません。

urlpatterns = patterns('',
    (r'^(?P<blog_slug>[-\w]+)/$', 'weblog_index', {}),
    ...
    (r'^', include('django.contrib.flatpages.urls')),
)

すべてのFlatpagesURLが最初のパターンによってトラップされるためです。最初のパターンをブログモデルの有効なスラッグにのみ一致させたいと思いますが、その方法がわかりません。

4

2 に答える 2

1

Dominicが指摘しているように、Flatpagesアプリの全体的なポイントは、他のビューに捕らえられていないすべてのページに自動的に一致することです。

したがって、weblog_indexビューを有効なスラッグのみに制限することはできませんが、そのビュー内で単純な操作を行うことができますget_object_or_404。これにより、一致するブログスラッグが見つからない場合に404​​エラーが発生し、404はFlatpagesアプリによって即座にインターセプトされます。 、そしてすべてがあなたが望むように動作します。

于 2010-09-16T11:58:43.867 に答える
1

あなたはこれを行うことはできません:

最初のパターンがブログ モデルの有効なスラッグにのみ一致するようにしたいのですが、その方法がわかりません。

はいので、Django は正規表現に一致する最初のビューのみを試行します。そのビューで 404 が発生した場合、他の URL は試行されません。

ただし、に何も追加せずに、やろうとしていることを行うことができurls.pyます:

Django ドキュメントから:

flatpages アプリをインストールするには、次の手順に従います。

  1. まだそこにない場合は、設定に追加'django.contrib.sites'して、サイト フレームワークをインストールします。INSTALLED_APPS

  2. SITE_IDまた、設定ファイルが表すサイトの ID に正しく設定されていることも確認してください。これは通常 1 になります (つまりSITE_ID = 1、サイト フレームワークを使用して複数のサイトを管理している場合は、別のサイトの ID になる可能性があります。

  3. 設定に追加'django.contrib.flatpages'してくださいINSTALLED_APPS

  4. 設定に追加'django.contrib.flatpages.middleware.FlatpageFallbackMiddleware'してくださいMIDDLEWARE_CLASSES

  5. コマンドを実行しますmanage.py syncdb

基本的に、ブログ エントリが存在しないスラッグに遭遇したときにブログ アプリが を発生させる限り、Http404問題はありません。

Djangoがエラー ページをレンダリングする直前に、404 を生成した URL に一致するパスを持つ をチェックすることを意味し'django.contrib.flatpages.middleware.FlatpageFallbackMiddleware'ます(つまり、404 がある場合は、 のチェックにフォールバックします)。存在する場合は、それをレンダリングします。MIDDLEWARE_CLASSESFlatPageFlatPage

于 2010-09-16T11:31:45.293 に答える