Джанго кросс-сайт обратный URL

У меня есть похожий вопрос, чем кросс-сайт Django. Но я думаю, что не могу применить одно и то же решение.

Я создаю приложение, которое позволяет пользователям создавать свой собственный сайт. После заполнения регистрационной формы пользователь должен быть перенаправлен на новую почтовую форму своего сайта. Что-то вроде этого:

        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)

Теперь я знаю, что "new_post_url" ужасен и заставляет детей плакать, поэтому мне нужно как-то поменять его. Я решил использовать django.core.urlresolvers.reverse для решения этой проблемы, но он возвращает только URL-адреса в моем домене, а не во вновь созданном сайте пользователя, поэтому он не работает для меня.

Итак, вы знаете лучший / умный способ решить эту проблему?

2 ответа

Решение

Похоже, что домен является поддоменом вашего собственного веб-сайта, так что имеет значение, что вы не можете перевернуть эту часть? С помощью reverse он не использует полные пути домена, он дает вам путь от корня проекта, поэтому вы можете просто сделать что-то вроде:

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

Таким образом, вы все еще используете реверс, так что вы не жестко программируете URL-адреса (и не заставляете детей плакать), и, насколько я вижу, у вас нет реальной проблемы.

Наконец, если вы не хотите жестко кодировать свой собственный домен в коде, используйте модель сайтов Django для получения текущего сайта, убедитесь, что изменили его со стандартного example.com на свой собственный домен, так что, наконец, ваш код может быть:

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')))

Если вам нужно получить домен без использования объекта Sites, лучшим вариантом может быть request.get_host (), который получит полный домен плюс порт, но не протокол.

Надеюсь, это все объясняет. Вы можете форматировать вещи немного лучше, но в этом суть.

redirect также необязательно принимает имя-представления в качестве аргумента, поэтому, поскольку у вас уже есть все необходимые ему переменные, просто передайте имя представления со всеми необходимыми аргументами и покончите с этим, а не пытайтесь выполнить сложную обратную операцию!

Если вы все еще хотите использовать обратный характер, возможно, вам следует использовать get_absolute_url в модели Сайта.

Другие вопросы по тегам