web-dev-qa-db-ja.com

Django「サイト」モデル-「SITE_ID = 1」とは何ですか?

DjangoのSitesモデルで作業しようとしています。

SITE_IDSITE_ID = 1である理由をよく理解できません。

ドキュメント内:

Django_siteデータベーステーブル内の現在のサイトの整数としてのID。これは、アプリケーションデータが特定のサイトにフックし、単一のデータベースが複数のサイトのコンテンツを管理できるようにするために使用されます。

なぜ1current siteとは何ですか?これはドキュメントで明確に説明されていません。

言うことができます、私はwww.somecoolsite.comwww.wow.coolsite.comwww.awesome.coolsite.comのような他のサブドメインを持っています

ドメイン名に応じて異なるコンテンツをレンダリングしたい。

私の質問は、またはそれ以上です:

  1. これらすべてのドメインをDBのSitesテーブルに追加する必要がありますか?
  2. もしそうなら、どのように設定でSITE_IDを設定する必要がありますか? SITE_ID = 1SITE_ID = 2 ..などのすべてのIDを設定する必要がありますか?
  3. current siteSITE_ID = 1とどう関係しますか?

ここで少し混乱しています。

私は、各サイト(例えばwww.wow.coolsite.com)は別個のDjango=プロジェクトである必要があるため、独自のsettings.py?を持つことができ、これらの各settings.pyの中で、 SitesテーブルからそのページのIDを設定しますか?しかし、多くのDjango=プロジェクトは私にとっても意味がありません。

35
doniyor

Djangoは、複数のドメインでコンテンツを公開するために新聞で開発された一連のスクリプトから作成されました。単一のコンテンツベースを使用します。

これが「サイト」モジュールの出番です。その目的は、異なるドメインに表示されるコンテンツをマークすることです。

Djangoの以前のバージョンでは、startprojectスクリプトが_Django.contrib.sites_アプリケーションを_INSTALLED_APPS_に自動的に追加し、syncdbを実行したときに RL _example.com_がデータベースに追加されました 。これは最初のサイトであるため、そのIDは_1_であり、そこから設定が行われます。

1.6以降では、このフレームワークはデフォルトでは有効になっていないことに注意してください。必要な場合は、 有効化

_SITE_ID_設定は、プロジェクトのdefaultサイトを設定します。 サイトを指定しない の場合、これが使用されます。

したがって、異なるドメイン用にアプリケーションを構成するには:

  1. サイトフレームワークを有効にする
  2. デフォルトのサイトを_example.com_からデフォルトのドメインに変更します。これは、Django Shell、または管理者から実行できます。
  3. コンテンツをサイトアプリケーションに公開する他のサイトを追加します。繰り返しになりますが、これは他のアプリケーションと同じようにDjango Shellから、または管理者から行うことができます。
  4. オブジェクトsite = models.ForeignKey(Site)のサイトモデルに外部キーを追加します
  5. サイトマネージャー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
_

ドキュメント には完全な例があります。

27
Burhan Khalid

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として使用する必要があるものです。

modified admin page showing Site records' 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が必要です。

13
RobM

これは、サイトフレームワークの 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
6
Jonathan Potter

これは遅い回答ですが、SITE_IDの問題とサイトの問題を抱えている他の人にとっては。データベース内では、Djangoは(id、domain、name)を持つDjango_siteテーブルを持っています。これはDjango= SITE_IDを格納します。データベースが、私は設定でSITE_ID = 1に設定していた。

それを知って、データベースに戻ってクリアしてゼロに戻すか、データベースの実際のIDを使用することができます。

4
Edwinner

これは 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の共通データベースフレームワーク/

1
Mariah