1

私のurl.pyには次のものがあります:

urlpatterns += patterns('',
    url(r'^tinymce/', include('tinymce.urls')),
    url(r'^', include('cms.urls')),
    url(r'^journal/', include('zinnia.urls')),
    url(r'^comments/', include('django.contrib.comments.urls')),
)

urlpatterns += patterns('',
    url(r'^(?P<slug>[-\w\d]+)/$', PremiumListingDetailView.as_view(), name='premium_listing'),
)

DetailView を表示するために、 http://www.example.com/slugにプレミアム リストのスラッグの URL を用意したいと考えています。django-cms の前にプレミアム リスティングの URL を配置するとページが読み込まれますが、残りの cms ページは表示されません。たとえば、http://www.example.com/aboutに移動すると 404 がスローされます。 cms のインクルード URL、http://www.example.com/slugへの移動は機能しません。

必要なものを実現するには、urls ファイルをどのように構成すればよいですか? 今のところ、リストの URL の前にチルダを付けてurl(r'^~(?P<slug>[-\w\d]+)/$, ...)いますが、これは最善の解決策ではないかもしれません。

4

1 に答える 1

1

アプリ x 用の URL は、アプリ y のパターンと照合されます。ビューはスラッグと一致せず、404 not found を返します。

パターンr'^'orr'^(?P<slug>[-\w\d]+)/$'は最後に来る必要があります。同じものに一致するため、2 つのうちの 1 つだけを使用してください (cms.urls を参照してください)。スラッグコメントを持つ PremiumListingDetailView オブジェクトを考えてみましょう。現時点では、コメント アプリをハイジャックします。広い一致パターンを最後に置くと、重要なパターンが常に優先されます。

パターン衝突を修正する簡単な (そして将来性のある) 方法は、パターンをユニークにすることです:

url(r'^cms/', include('cms.urls')), # Added cms/

スラッグがtinymcecmsジャーナル、またはコメントでない場合、最終的に PremiumListingDetailView になります。

別の方法として、PremiumListingDetailView パターンを一意にすることもできます (チルダでこれを行いました)。

url(r'^list/(?P<slug>[-\w\d]+)/$', # Added list/
    PremiumListingDetailView.as_view(), 
    name='premium_listing'),

url(r'^', include('cms.urls')), # CMS comes after.

しかし、cms が にビューを持っている場合はどうなるlist/something/でしょうか? cms ビューには到達しません。リクエストは PremiumListingDetailView によって処理され、slug somethingが存在しないため、404 が返されます。

技術的には、PremiumListingDetailView パターンを cms.urls に配置できます。ここでは、cms または PremiumListingDetailView パターンが一致するタイミングを細かく制御できますが、パターンは依然として衝突する可能性があります。これは、疎結合の原則に違反します。それはあなたをかみます。

結論: 固有の URL にアプリを含めます。アプリ内の各パターンが一意であることを確認してください。ワイド マッチング パターンは、より重要なパターンの後に配置する必要があります。

于 2013-09-24T11:24:22.797 に答える