Pregunta

Tengo una pregunta similar que Django reverso de sitio cruzado. Pero creo que no puedo aplicar la misma solución.

Estoy creando una aplicación que permite a los usuarios crear su propio sitio. Después de completar el formulario de registro, el usuario debe ser redirigido al nuevo formulario de publicación de su sitio. Algo en esta línea:

        new_post_url = 'http://%s.domain:9292/manage/new_post %site.domain'
        logged_user = authenticate(username=user.username, password=user.password)
        if logged_user is not None:
            login(request, logged_user)
            return redirect(new_product_url)

Ahora, sé que "new_post_url" es horrible y hace llorar a los bebés, así que necesito revertirlo de alguna manera. Pensé en usar django.core.urlresolvers. Para resolver esto, pero eso solo devuelve URL en mi dominio, y no en el sitio recién creado del usuario, por lo que no funciona para mí.

Entonces, ¿conoces una forma mejor/más inteligente de resolver esto?

¿Fue útil?

Solución

Parece que el dominio es un subdominio de su propio sitio web, entonces, ¿qué importa que no pueda revertir esa parte? Usando reverse No usa rutas de dominio completas, le da la ruta desde la raíz del proyecto, por lo que simplemente puede hacer algo como:

new_post_uri = 'http://%s.domain:9292%s' % (site.domain, reverse('manage_new_post'))

De esta manera, todavía está usando el reverso para que no esté codificando las URL (y haciendo llorar a los bebés) y realmente no tiene un problema por lo que puedo ver.

Finalmente, si no desea codificar su propio dominio en el código, usa Django's Sitios Modelo para obtener el sitio actual, asegúrese de modificarlo desde el ejemplo predeterminado.com a su propio dominio, por lo que finalmente su código puede ser:

current_site = Site.objects.get_current() # See the docs for other options
return redirect('http://%s.%s%s' % (site.domain, current_site, reverse('manage_new_post')))

Si necesita obtener el dominio sin usar el objeto Sitios, su mejor apuesta puede ser request.get_host (), que obtendrá el dominio completo más el puerto, pero no el protocolo.

Ojalá eso te explique las cosas. Puedes formatear las cosas un poco mejor, pero esa es la esencia.

Otros consejos

redirect También opcionalmente toma un nombre de vista como argumento, por lo que, dado que ya tiene todas las variables necesarias, simplemente pase el nombre de vista con todos los argumentos requeridos y se haga con él, en lugar de probar un reverso complicado.

Si aún desea una naturaleza inversa, puede ser que debe usar, get_absolute_url en el modelo del sitio.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top