Джанго кросс-сайт обратный URL - PullRequest
2 голосов
/ 06 апреля 2010

У меня есть похожий вопрос, чем межсайтовая обратная связь 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 ]

1 голос
/ 07 апреля 2010

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

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

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

Наконец, если вы не хотите жестко кодировать свой собственный домен в коде, используйте модель Django Sites для получения текущего сайта, убедитесь, что вы изменили его с сайта 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 () , который получит полный домен плюс порт, но не протокол.

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

0 голосов
/ 07 апреля 2010

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

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

...