1

同じURLパターンで2つのアプリを実行したいと思います。domain.com/pages/something-hereやdomain.com/blog/something-thereのようなアプリ固有のスラッグは避けたいと思います。

私はこれを試しました:

# urls.py
urlpatterns = patterns('',
    url(r'^$', 'my.homepage.view'),
    url(r'^admin/', include(admin.site.urls)),
    url(r'^', include('pages.urls')),
    url(r'^', include('blog.urls')),
)

# pages/urls.py
urlpatterns = patterns('',
    url(r'^(.+)/$', views.page),
)

# blog/urls.py
urlpatterns = patterns('',
    url(r'^(.+)/$', views.post),
)

私のコードは機能しません。どちらが先に来るか(ここでは、pages.urls)は問題なく機能し、他のURL(ブログ用)は404をスローします。

前もって感謝します

編集:私はこれを次のように行いました:settings.pyと同じディレクトリにglue.pyを作成しました。それは私のホームページとこのディスパッチャビューを処理します:

def dispatcher(request, slug):
    try:
        page = get_object_or_404(Page, slug=slug)
        return render(request, 'pages/page.html', {'page': page})
    except:
        post = get_object_or_404(Post, slug=slug)
        return render(request, 'blog/post.html', {'post': post})

大丈夫かわかりません。もっと良い方法があるといいのですが。

コメントありがとうございます。

4

3 に答える 3

1

これがより良い答えかどうかはわかりません。しかし、これらの状況があなたにとって満足しているなら..

  1. django アプリが django テンプレート レンダリングに基づいている場合。

  2. あなたが話しているURLは、ブラウザ自体にエンドポイントを入力して直接アクセスする必要はありません。

次に、url 名前空間とテンプレートのリダイレクトを検討できます。

https://docs.djangoproject.com/en/1.11/topics/http/urls/#url-namespaces

于 2017-05-12T15:41:29.437 に答える
0

django の URL は順番に解決されるため、これは機能しません。つまり、正規表現に一致する最初の URL が解決されます。あなたの場合、django は既にページの URL に行が含まれていることを解決しているため、ブログ アプリケーションに含まれる URL は検索されません。

また、django urlモジュールは、特定のページまたはブログ投稿が存在するかどうかを知ることは想定されていません。これは、データベースルックアップで決定されるアプリケーションであると信じています。

urls モジュールは、一致する最初の正規表現に接続されているビューを実行するだけです。

ロジックを変更する必要があります。たとえば、「blog/」をブログの URL に追加する必要があります (何が問題なのですか?)

   url(r'^blog/', include('blog.urls')),
   url(r'^', include('pages.urls')),

ほとんどの一般的な regxexp は、django url リゾルバーによって常に最後に試行される必要があるため、ブログの URL を上に移動したことに注意してください。

または、ブログの投稿とページの両方を試行するプロキシ ビューをコーディングすることもできます。しかし、それは私にとって最善の方法ではないようです。

于 2013-02-15T17:06:12.133 に答える
-1

これをどのように機能させたいですか?どちらも同じ URL を使用しています (もちろん、これが問題を引き起こしています)。ユーザーはどのようにして「ブログ」ではなく「ページ」にアクセスしますか、またはその逆ですか?

通常、URL パターンに重複する URL を含めることはできません (追加のデータを含める必要はありません)。

編集:

最初のアプリで URL に一致するビューがあるかどうかを確認し、最初のアプリが一致しない場合は次に引き継ぎますか? 「ビュー マッチャー」を作成して必要な処理を行うなど、複雑なことを行うこともできますが、もっと簡単な解決策があります。

最も簡単な方法はslug、いずれかのアプリの生成関数を変更することです。アンダースコア以外の区切り文字を使用するか、常にアプリの名前をスラッグに追加してください。このようにして、ページの URL が「some-slug-page」になり、ブログが「some-slug-blog」になるため、ページを見つけることができます。これに対して URL パターンを記述できます。URL全体を追加したくない場合は、最初の文字だけを追加/先頭に追加するか、必要に応じて追加できます.

URL を読み取るだけで、そのページがどのアプリに属しているかがわかるように、各アプリの URL を生成するための許容できる方法を考えてみてください。

于 2013-02-15T16:33:13.713 に答える