2010-04-06 3 views
2

У меня аналогичный вопрос, чем django cross-site reverse. Но я думаю, что не могу применить одно и то же решение.django cross-site reverse a url

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

 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-адреса в моем домене, а не на вновь созданный сайт пользователя, поэтому для меня это не работает.

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

ответ

1

Похоже, что домен является субдоменом вашего собственного сайта, так что имеет значение, что вы не можете отменить эту часть? Использование 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'))) 

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

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

+0

это * домен: 9292 * часть URI, которая беспокоит меня. Я не знаю из первых рук, в какой домене будет работать сайт. В этом контексте current_site не обязательно имеет домен серверов, так как я запускаю приложение в разных установках (то есть: домен current_site может быть сохранен как «example.com», но я запускаю приложение в localhost: 8000). Мне нужно получить его динамически, поэтому вопрос – tutuca

+0

, поэтому я не понял полностью, тогда вам просто нужно извлечь текущий домен, который вы можете использовать 'request.get_host()', который будет извлекать текущий домен и порт, но а не протокол, поэтому вам придется сказать, используете ли вы http: // или https: //. Надеюсь, что h elps – Bartek

+1

Вы можете использовать 'request.is_secure()' для определения протокола. Таким образом, вы можете использовать строку: 'protocol = request.is_secure() и 'https' или 'http'' – JohnTESlade

0

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

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