2015-03-16 3 views
2

У меня есть требование, чтобы всякий раз, когда я вхожу в систему или пытаюсь запросить представление с именем login_decorator, то следующей страницей будет страница, на которой я должен попросить пользователя выбрать бизнес-объект (независимо от того, оригинальное представление запрошено).Django Redirect после успешного входа

Допустим, что страница http://127.0.0.1:8999/APP/business_unit

Для достижения этой цели я установил следующее в моем settings.py

LOGIN_REDIRECT_URL='/APP/business_unit_selector' 

Теперь, когда я пытаюсь получить доступ к http://127.0.0.1:8999/APP/range_list страницы идет к http://127.0.0.1:8999/APP/login?next=/APP/range_list я ожидал что следующая страница после входа в систему будет /APP/business_unit

, но вместо этого следующая страница была /APP/range_list

адресная строка браузера есть http://127.0.0.1:8999/APP/login?next=/APP/range_list

Можно ли добиться того, что я пытаюсь в Django?

+0

http://stackoverflow.com/questions/4870619/django-after-login-redirect-user-to-his-custom-page-mysite-com- имя пользователя –

ответ

1

LOGIN_REDIRECT_URL используется unly когда next не определен , В вашем тестовом запросе есть next=/APP/range_list - и этот адрес используется для перенаправления пользователя после входа в систему.

Вероятно, самым простым и наиболее эффективным решением является сделать свой собственный декоратора, похожий на login_required, который перенаправляет /APP/business_unit_selector&next=<redirect_url>, если блок не выбран, и применять его вместе с login_required. Это не самое эффективное решение с точки зрения количества переадресаций, но оно довольно чистое и не испортит страницу входа.

Вам также придется обрабатывать параметр next в вашем business_unit_selector виде, если вы хотите добиться естественного потока.

Ваш декоратор должен быть чем-то вроде

from django.contrib.auth.decorators import login_required 
from django.core.urlresolvers import reverse 
from django.shortcuts import redirect 
from django.utils.http import urlquote 
import functools 

def business_unit_required(view): 
    @login_required # probably you want to incorporate it here 
    @functools.wraps(view) 
    def wrapped(request, *args, **kwargs): 
     if not 'selected_business_unit' in request.session: 
      return redirect('%s?next=%s' % (
       reverse('business_unit_selector'), 
       urlquote(request.get_full_path()))) 
     return view(request, *args, **kwargs) 
    return wrapped 
+0

Благодаря @Frax, который был жемчужиной кода – Guddu

1

Причина, по которой http://127.0.0.1:8999/APP/login?next=/APP/range_list перенаправляет вас range_list после входа в систему, потому, что с next= переопределении, что указано в файле настроек, LOGIN_REDIRECT_URL='/APP/business_unit_selector'.

Если я правильно понимаю, что вам нужно пользователю выбрать бизнес-объект после входа в

пару решений, которые приходят на ум, являются следующие:.

1.) Не используйте отдельные формы для логина и бизнес-объекта. Вместо этого объедините их.

Username 
Password 
Business Entity 

2.) Вы можете также указать, на ваш взгляд, если пользователь не имеет Промишленое объект ResponseRedirect ("/ APP/business_unit_selector") docs here

+0

Спасибо за ваш ответ. Исправлено сообщение. Когда я пытаюсь получить доступ к http://127.0.0.1:8999/APP/range_list, страница идет по адресу http://127.0.0.1:8999/APP/login?next=/APP/range_list. Я ожидал, что следующая страница после login be/APP/business_unit – Guddu

+0

Можете ли вы опубликовать код для своих функций просмотра?Я думаю, что если я увижу эту часть кода, я смогу лучше понять, что происходит. – marcusshep

Смежные вопросы