DjangoのSites
モデルで作業しようとしています。
SITE_ID
がSITE_ID = 1
である理由をよく理解できません。
ドキュメント内:
Django_siteデータベーステーブル内の現在のサイトの整数としてのID。これは、アプリケーションデータが特定のサイトにフックし、単一のデータベースが複数のサイトのコンテンツを管理できるようにするために使用されます。
なぜ1
? current site
とは何ですか?これはドキュメントで明確に説明されていません。
言うことができます、私はwww.somecoolsite.com
とwww.wow.coolsite.com
やwww.awesome.coolsite.com
のような他のサブドメインを持っています
ドメイン名に応じて異なるコンテンツをレンダリングしたい。
私の質問は、またはそれ以上です:
Sites
テーブルに追加する必要がありますか?SITE_ID
を設定する必要がありますか? SITE_ID = 1
、SITE_ID = 2
..などのすべてのIDを設定する必要がありますか?current site
はSITE_ID = 1
とどう関係しますか?ここで少し混乱しています。
私は、各サイト(例えばwww.wow.coolsite.com
)は別個のDjango=プロジェクトである必要があるため、独自のsettings.py?を持つことができ、これらの各settings.pyの中で、 SitesテーブルからそのページのIDを設定しますか?しかし、多くのDjango=プロジェクトは私にとっても意味がありません。
Djangoは、複数のドメインでコンテンツを公開するために新聞で開発された一連のスクリプトから作成されました。単一のコンテンツベースを使用します。
これが「サイト」モジュールの出番です。その目的は、異なるドメインに表示されるコンテンツをマークすることです。
Djangoの以前のバージョンでは、startproject
スクリプトが_Django.contrib.sites
_アプリケーションを_INSTALLED_APPS
_に自動的に追加し、syncdb
を実行したときに RL _example.com
_がデータベースに追加されました 。これは最初のサイトであるため、そのIDは_1
_であり、そこから設定が行われます。
1.6以降では、このフレームワークはデフォルトでは有効になっていないことに注意してください。必要な場合は、 有効化
_SITE_ID
_設定は、プロジェクトのdefaultサイトを設定します。 サイトを指定しない の場合、これが使用されます。
したがって、異なるドメイン用にアプリケーションを構成するには:
example.com
_からデフォルトのドメインに変更します。これは、Django Shell、または管理者から実行できます。site = models.ForeignKey(Site)
のサイトモデルに外部キーを追加しますon_site = CurrentSiteManager()
を追加しますここで、デフォルトサイトまたは特定のサイトのコンテンツをフィルタリングする場合:
_foo = MyObj.on_site.all() # Filters site to whatever is `SITE_ID`
foo = MyObj.objects.all() # Get all objects, irrespective of what site
# they belong to
_
ドキュメント には完全な例があります。
DjangoのデフォルトのSiteAdminに_list_display
_フィールドにidフィールドが含まれていれば、物事はずっと簡単に理解できます。
これを行うには、SiteAdmin(アプリ内の任意の場所、ただしadmin.pyまたはurls.pyをお勧めします)を次のように再定義できます。
_from Django.contrib import admin
from Django.contrib.sites.models import Site
admin.site.unregister(Site)
class SiteAdmin(admin.ModelAdmin):
fields = ('id', 'name', 'domain')
readonly_fields = ('id',)
list_display = ('id', 'name', 'domain')
list_display_links = ('name',)
search_fields = ('name', 'domain')
admin.site.register(Site, SiteAdmin)
_
このコードスニペットを含めると、各「サイト」のIDが管理者リストの最初の列とフォーム内に読み取り専用フィールドとして表示されます。これらの「id」フィールドは、SITE_IDとして使用する必要があるものです。
概念は、各サイトが異なるアプリケーションサーバーインスタンスで実行され、異なるyourdomain_settings.pyを使用して起動され、残りの共通設定とともにbase_settings.pyが含まれることです。
これらのyourdomain_settings.pyのそれぞれは、独自のSITE_IDと、他のすべての異なるsettings.pyパラメーターを定義します。これらのパラメーターは、見た目が異なり、互いに異なる必要があります(静的リソース、テンプレートなど) define a Django_SETTINGS_MODULE特定のyourdomain_settings.pyファイルを指す環境変数 そのドメインのアプリケーションサーバーインスタンスを起動するとき。
さらに注意:get_current_site(request)
が機能するにはrequest
が必要です。コードにコードがない場合は、Site.objects.get_current()
を使用できますが、実行中のアプリケーションサーバーの設定で適切に定義されたSITE_IDが必要です。
これは、サイトフレームワークの documentation で説明されています。
本番環境で異なるサイトにサービスを提供するには、各SITE_IDで個別の設定ファイルを作成し(共有設定の重複を避けるために共通の設定ファイルからインポートするなど)、各サイトに適切なDjango_SETTINGS_MODULEを指定します。
ただし、そのようにしたくない場合は、SITE_ID
を使用し、ビュー内のドメイン名に基づいて現在のサイトをget_current_site
:
from Django.contrib.sites.shortcuts import get_current_site
def my_view(request):
current_site = get_current_site(request)
if current_site.domain == 'foo.com':
# Do something
pass
else:
# Do something else.
pass
これは遅い回答ですが、SITE_IDの問題とサイトの問題を抱えている他の人にとっては。データベース内では、Djangoは(id、domain、name)を持つDjango_siteテーブルを持っています。これはDjango= SITE_IDを格納します。データベースが、私は設定でSITE_ID = 1に設定していた。
それを知って、データベースに戻ってクリアしてゼロに戻すか、データベースの実際のIDを使用することができます。
これは link で説明しています:
追加するドメインごとに個別の設定ファイルを作成する必要があります。それぞれが独自のMEDIA_URLおよびその他の設定を必要とします。また、さまざまなサイトを管理するためにすべてが適切に機能することを確認するために、次の2つのことを行います。
各ドメインの管理者に新しいサイトオブジェクトを作成し、そのサイトのIDをSITE_IDとして設定ファイルに入れます。したがって、Djangoは、この設定ファイルに対応するデータベース内のサイトを認識します。
元のサイト(id 1のサイト)の設定ファイルで、他のサイトの設定ファイルをADMIN_FOR設定に追加し、Djangoが管理アプリケーションのこの1つのインスタンスがすべてのサイトを処理します。
また、モデルを変更してビューを設定する方法を知りたい場合は、次のリンクをご覧ください: https://Django.cowhite.com/blog/managing-multiple-websites-with-a- Djangoの共通データベースフレームワーク/