get_current_site - django examples
Modelo de "Sitios" de Django: ¿qué es y por qué es ''SITE_ID=1''? (4)
Estoy tratando de trabajar con los Sites
Modelo de Django.
No entiendo bien por qué SITE_ID
debería ser SITE_ID = 1
.
en los documentos:
El ID, como un entero, del sitio actual en la tabla de base de datos django_site. Esto se usa para que los datos de la aplicación puedan conectarse a sitios específicos y una sola base de datos puede administrar el contenido de múltiples sitios.
porque 1
¿Cuál es el current site
? Esto no se explica claramente en los documentos.
digamos, tengo www.somecoolsite.com
y algunos otros subdominios como www.wow.coolsite.com
y www.awesome.coolsite.com
Quiero hacer diferente contenido dependiendo del nombre de dominio.
Mi pregunta es, o mejor, son:
- ¿Tengo que agregar todos esos dominios en la tabla de
Sites
en la base de datos? - Si es así, ¿cómo debo configurar
SITE_ID
en la configuración? ¿Tengo que configurar todos los identificadores comoSITE_ID = 1
,SITE_ID = 2
.. etc? - ¿Qué tiene que ver el
current site
conSITE_ID = 1
?
Estoy un poco confundido aquí.
Pensé, cada sitio (por ejemplo, www.wow.coolsite.com
) debería ser un proyecto django separado para que puedan tener su propia configuración.py? y en cada uno de esos settings.py, estableceré el ID de esa página en la tabla de Sitios? pero luego hay muchos proyectos django que tampoco tienen sentido para mí.
Django se creó a partir de un conjunto de scripts desarrollados en un periódico para publicar contenido en múltiples dominios; utilizando una sola base de contenido.
Aquí es donde entra el módulo de "sitios". Su propósito es marcar el contenido que se mostrará para los diferentes dominios.
En versiones anteriores de django, el script startproject
automáticamente agregó la aplicación django.contrib.sites
a INSTALLED_APPS
, y cuando hizo syncdb
, se syncdb
un sitio predeterminado con la URL example.com
a su base de datos , y dado que este fue el primer sitio, su ID era 1
y de ahí viene la configuración.
Tenga en cuenta que a partir de 1.6, este marco no está habilitado de forma predeterminada. Así que si lo necesitas, debes habilitarlo.
La configuración SITE_ID
establece el sitio predeterminado para su proyecto. Entonces, si no especifica un sitio , este es el que usará.
Entonces para configurar su aplicación para diferentes dominios:
- Habilitar el marco de sitios
- Cambie el sitio predeterminado de
example.com
a cualquiera que sea su dominio predeterminado. Puedes hacer esto desde el shell de django, o desde el administrador. - Agregue sus otros sitios para los que desea publicar contenido en la aplicación de sitios. Nuevamente, puedes hacer esto desde el shell de django como cualquier otra aplicación o desde el administrador.
- Agregue una clave externa al modelo de sitio en su
site = models.ForeignKey(Site)
objetosite = models.ForeignKey(Site)
- Agregue el administrador del sitio
on_site = CurrentSiteManager()
Ahora, cuando desee filtrar el contenido del sitio predeterminado o de un sitio en particular:
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 documentación tiene un conjunto completo de ejemplos.
Esta es una respuesta tardía, pero para cualquier otra persona que tenga problemas con SITE_ID y problemas del sitio. Dentro de la base de datos, django tiene una tabla django_site con (id, dominio, nombre). Aquí es donde django almacena los SITE_IDs. El mío era en realidad 5 en la base de datos, pero lo tenía configurado en SITE_ID = 1 en la configuración.
Sabiendo eso, ahora puedo volver a la base de datos y borrarla para volver a cero o usar la identificación real en la base de datos.
Esto está cubierto en la documentation para el marco de Sitios:
Para servir a diferentes sitios en producción, crearía un archivo de configuración separado con cada SITE_ID (quizás importando desde un archivo de configuración común para evitar la duplicación de la configuración compartida) y luego especifique el DJANGO_SETTINGS_MODULE apropiado para cada sitio.
Pero si no quería hacerlo de esa manera, no puede configurar SITE_ID
en absoluto y simplemente busque el sitio actual en función del nombre de dominio en sus vistas usando 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
Las cosas serían mucho más fáciles de entender si el SiteAdmin predeterminado de Django incluyera el campo id en los campos list_display
.
Para hacer esto, puede redefinir SiteAdmin (en cualquier lugar de su aplicación, pero recomendaría su admin.py o tal vez su urls.py) de esta manera:
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)
Después de incluir este fragmento de código, la ID de cada "Sitio" se mostrará en la primera columna de la lista de administradores y dentro del formulario como un campo de solo lectura. Estos campos ''id'' son lo que necesita usar como SITE_ID:
El concepto es que cada sitio diferente se ejecuta en una instancia diferente del servidor de aplicaciones, que se inicia con un yourdomain_settings.py diferente que luego incluye un base_settings.py con el resto de la configuración común.
Cada uno de estos yourdomain_settings.py definirá su propio SITE_ID y todos los demás parámetros de settings.py diferentes que necesitan para verse y ser diferentes entre sí (recursos estáticos, plantillas, etc.) y luego definirá una variable de entorno DJANGO_SETTINGS_MODULE que apunta a ese archivo específico yourdomain_settings.py al iniciar la instancia del servidor de aplicaciones para ese dominio.
Otra nota: get_current_site(request)
necesita una request
para estar disponible para que funcione. Si su código no tiene uno, puede usar Site.objects.get_current()
que, sin embargo, necesitará un SITE_ID correctamente definido en la configuración del servidor de aplicaciones en ejecución.