variable template tag pass parameter links current python django django-signals django-settings

python - template - href django



Django: Obtención de la URL absoluta sin acceso a un objeto de solicitud (2)

Tengo un modelo como el de abajo. Cuando se crea una instancia, deseo enviar un correo electrónico a una parte interesada:

class TrainStop(models.Model): name = models.CharField(max_length=32) notify_email = models.EmailField(null=True, blank=True) def new_stop_created(sender, instance, created, *args, **kwargs): # Only for new stops if not created or instance.id is None: return # Send the status link if instance.notify_email: send_mail( subject=''Stop submitted: %s'' % instance.name, message=''Check status: %s'' % reverse(''stop_status'', kwargs={''status_id'':str(instance.id),}), from_email=''[email protected]'', recipient_list=[instance.notify_email,] ) signals.post_save.connect(new_stop_created, sender=TrainStop)

Sin embargo, la llamada reverse solo devuelve la parte de la ruta de la URL. Ejemplo: /stops/9/status/ . Necesito una URL completa como http://example.com/stops/9/status/ . ¿Qué debo hacer para recuperar el nombre de host y el puerto (para las instancias de prueba que no usan el puerto 80) del sitio web actual?

Mi idea inicial fue hacer que esto estuviera disponible a través de una variable en settings.py que luego podría acceder según sea necesario. Sin embargo, pensó que alguien podría tener una sugerencia más robusta.


Está el marco de los sitios, como lo mencionó yedpodtrzitko, pero, como mencionaste, es mucho más que una configuración manual.

Se requiere una configuración en settings.py, pero es solo un poco menos manual que la configuración de sitios. (Puede manejar múltiples dominios, al igual que los sitios y la configuración SITE_ID ).

Hay una idea para reemplazar get_absolute_url , que facilitaría este tipo de cosas, aunque creo que su implementación tiene el mismo problema (cómo obtener el dominio, el esquema [http vs https], etc.).

He estado jugando con la idea de un middleware que examina las solicitudes entrantes y construye una configuración de "dominio más probable" de algún tipo en función de la frecuencia del valor del encabezado HTTP HOST. O tal vez podría establecer esta configuración en cada solicitud individualmente, por lo que siempre podría tener el dominio actual para trabajar. No he llegado al punto de estudiarlo seriamente, pero es un pensamiento.


Para obtener el sitio actual hay sitio del objeto:

Si no tiene acceso al objeto de solicitud, puede usar el método get_current () del administrador del modelo del sitio. A continuación, debe asegurarse de que su archivo de configuración contenga la configuración SITE_ID. Este ejemplo es equivalente al anterior:

from django.contrib.sites.models import Site def my_function_without_request(): current_site = Site.objects.get_current() if current_site.domain == ''foo.com'': # Do something pass else: # Do something else. pass

Más información: http://docs.djangoproject.com/en/dev/ref/contrib/sites/