web-dev-qa-db-fra.com

Modèle 'Sites' de Django - qu'est-ce que et pourquoi 'SITE_ID = 1'?

J'essaie de travailler avec Sites Model of Django. 

Je ne comprends pas très bien pourquoi SITE_ID devrait être SITE_ID = 1

dans les docs: 

L'ID, en tant qu'entier, du site actuel dans la base de données Django_site table. Ceci est utilisé pour que les données d'application puissent être connectées à des fichiers spécifiques Les sites et une base de données unique peuvent gérer le contenu de plusieurs sites.

pourquoi 1? Qu'est-ce que le current site? cela n'est pas clairement expliqué dans la documentation. 

disons que j'ai www.somecoolsite.com et quelques autres sous-domaines comme www.wow.coolsite.com et www.awesome.coolsite.com

Je veux rendre un contenu différent en fonction du nom de domaine. 

ma question est, ou mieux, sont: 

  1. Dois-je ajouter tous ces domaines dans la table Sites dans la base de données? 
  2. si oui, comment dois-je définir SITE_ID dans les paramètres? Dois-je définir tous les identifiants comme SITE_ID = 1, SITE_ID = 2 .. etc? 
  3. qu'est-ce que current site a à voir avec SITE_ID = 1

Je suis un peu confus ici. 

Je pensais que chaque site (par exemple, www.wow.coolsite.com) devrait constituer un projet Django distinct, de manière à pouvoir avoir son propre paramètre settings.py? et dans chacun de ces settings.py, je vais définir l'id de cette page à partir de la table Sites? mais alors il y a beaucoup de projets Django qui n'ont pas de sens pour moi. 

29
doniyor

Django a été créé à partir d'un ensemble de scripts développés dans un journal pour publier du contenu sur plusieurs domaines. en utilisant une base de contenu unique.

C'est ici qu'intervient le module "sites". Son but est de marquer le contenu à afficher pour différents domaines.

Dans les versions précédentes de Django, le script startproject ajoutait automatiquement l'application Django.contrib.sites à INSTALLED_APPS, et lorsque vous avez fait syncdb, un site par défaut avec l'URL example.com a été ajouté à votre base de données , et comme il s'agissait du premier site, son ID était 1 et c'est de là que vient le réglage.

Gardez à l'esprit qu'à partir de la version 1.6, ce cadre n'est pas activé par défaut. Donc, si vous en avez besoin, vous devez l'activer

Le paramètre SITE_ID définit le site default pour votre projet. Donc, si vous ne spécifiez pas de site , c'est celui-ci qu'il utilisera.

Donc, pour configurer votre application pour différents domaines:

  1. Activer le framework de sites
  2. Modifiez le site par défaut de example.com à votre domaine par défaut. Vous pouvez le faire depuis le shell Django ou depuis l’administrateur.
  3. Ajoutez vos autres sites pour lesquels vous souhaitez publier du contenu dans l'application Sites. Encore une fois, vous pouvez le faire depuis le shell Django, comme pour toute autre application, ou depuis l’administrateur.
  4. Ajouter une clé étrangère au modèle de site dans votre objet site = models.ForeignKey(Site)
  5. Ajouter le gestionnaire de site on_site = CurrentSiteManager()

Maintenant, lorsque vous souhaitez filtrer le contenu pour le site par défaut ou pour un site particulier:

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

La documentation contient une série complète d’exemples.

25
Burhan Khalid

Les choses seraient beaucoup plus faciles à comprendre si SiteAdmin par défaut de Django incluait le champ id dans les champs list_display.

Pour ce faire, vous pouvez redéfinir SiteAdmin (n'importe où dans votre application, mais je recommanderais votre fichier admin.py ou peut-être votre urls.py) comme suit:

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)

Après avoir inclus cet extrait de code, l'ID de chaque "Site" sera affiché dans la première colonne de la liste des administrateurs et à l'intérieur du formulaire sous forme de champ en lecture seule. Ces champs "id" correspondent à ce que vous devez utiliser comme identifiant de site:

modified admin page showing Site records' id

Le concept est que chaque site différent s'exécute dans une instance de serveur d'applications différente, lancée à l'aide d'un fichier yourdomain_settings.py différent, qui inclut ensuite un fichier base_settings.py avec le reste de la configuration commune.

Chacun de vos domaines votredomaine.py définira son propre identifiant SITE_ID et tous les autres paramètres settings.py différents dont ils ont besoin pour être différents les uns des autres (ressources statiques, modèles, etc.), puis vous définissez une variable d'environnement Django_SETTINGS_MODULE pointant vers ce fichier yourdomain_settings.py lors du lancement de l'instance de serveur d'applications pour ce domaine.

Remarque supplémentaire: get_current_site(request) a besoin de request pour pouvoir fonctionner. Si votre code n'en a pas, vous pouvez utiliser Site.objects.get_current() qui nécessitera toutefois un SITE_ID correctement défini dans les paramètres du serveur d'applications en cours d'exécution.

7
RobM

Ceci est couvert dans documentation pour le framework Sites:

Afin de desservir différents sites en production, vous devez créer un fichier fichier de paramètres séparé avec chaque ID_SITE (éventuellement en important à partir d’un fichier de paramètres commun pour éviter la duplication de paramètres partagés), puis spécifiez le Django_SETTINGS_MODULE approprié pour chaque site.

Mais si vous ne voulez pas le faire de cette façon, vous ne pouvez pas définir SITE_ID du tout et rechercher simplement le site actuel en fonction du nom de domaine dans vos vues à l'aide de 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

Ceci est une réponse tardive, mais pour toute autre personne ayant des problèmes SITE_ID et des problèmes de site . Dans la base de données, Django a une table Django_site avec (id, domaine, nom). C'est là que Django stocke les SITE_ID. Le mien était en fait 5 dans la base de données mais je l'avais réglé sur SITE_ID = 1 dans les paramètres. 

Sachant cela, je peux maintenant revenir à la base de données et l'effacer pour revenir à zéro ou utiliser l'identifiant réel dans la base de données.

4
Edwinner

Ce link l'explique:

Vous voudrez créer des fichiers de paramètres distincts pour chaque domaine que vous ajoutez; chacun aura besoin de ses propres paramètres MEDIA_URL et autres. Vous voudrez également faire deux choses pour vous assurer que tout fonctionne correctement pour administrer les différents sites:

Créez un nouvel objet Site dans votre administrateur pour chaque domaine et mettez l'identifiant de ce site dans son fichier de paramètres sous le nom SITE_ID afin que Django sache quel site de la base de données correspond à ce fichier de paramètres.

Dans le fichier de paramètres de votre site d'origine (celui portant l'identifiant 1), ajoutez les fichiers de paramètres des autres sites au paramètre ADMIN_FOR, pour que Django sache que cette instance de l'application d'administration gérera tous les sites.

Aussi, si vous voulez comprendre comment modifier les modèles et définir les vues, vous pouvez consulter ce lien: https://Django.cowhite.com/blog/managing-multiple-websites-with-a -common-database-in-Django-the-sites-framework/

1
Mariah