2015-03-11 4 views
1

Я довольно новый ατ Django. Я пытаюсь разработать аутентификацию пользователя для своего приложения. Для чего я использую AuthenticationForm для формы и FormView для входа в систему. Я также создал пользовательский Backend, который аутентифицирует пользователей, используя адрес электронной почты вместо имени пользователя. Аутентификация, кажется, работает нормально, потому что она возвращает объект пользователя, когда поставляется с правильной электронной почтой и паролем, и в противном случае показывает ошибку. И form_valid() доставит меня до 'success_url'. Но когда я пытаюсь получить доступ к пользовательским атрибутам, таким как имя или адрес электронной почты, я не могу получить к ним доступ в шаблоне (success_url). И user.is_authenticated, кажется, возвращает False. Что может быть неправильным? Я потратил часы, пытаясь исправить это, но пока не успел. Я был бы очень признателен вам за ваше убеждение и внушение. Заранее спасибо.Пользователь не вошел. Шаблон не имеет доступа к пользовательским атрибутам

Вот мой LoginView:

класс LoginView (FormView):

form_class = AuthenticationForm 
success_url = "hello/" 
#redirect_field_name = REDIRECT_FIELD_NAME 
template_name = 'draint_user/login.html' 

@method_decorator(csrf_protect) 
@method_decorator(never_cache) 
def dispatch(self, *args, **kwargs): 
    return super(LoginView, self).dispatch(*args, **kwargs) 

def form_valid(self, form): 
    """ 
    The user has provided valid credentials (this was checked in AuthenticationForm.is_valid()). So now we 
    can check the test cookie stuff and log him in. 
    """ 
    self.check_and_delete_test_cookie() 
    user = form.get_user() 
    login(self.request, user) 
    print form.get_user().name 
    return super(LoginView, self).form_valid(form) 

def form_invalid(self, form): 
    """ 
    The user has provided invalid credentials (this was checked in AuthenticationForm.is_valid()). So now we 
    set the test cookie again and re-render the form with errors. 
    """ 
    self.set_test_cookie() 
    return super(LoginView, self).form_invalid(form) 

def get_success_url(self): 
    if self.success_url: 
     redirect_to = self.success_url 
    else: 
     redirect_to = self.request.REQUEST.get(self.redirect_field_name, '') 

    netloc = urlparse.urlparse(redirect_to)[1] 
    if not redirect_to: 
     redirect_to = resolve_url(settings.LOGIN_REDIRECT_URL) 
    # Security check -- don't allow redirection to a different host. 
    elif netloc and netloc != self.request.get_host(): 
     redirect_to = resolve_url(settings.LOGIN_REDIRECT_URL) 
    return redirect_to 

def set_test_cookie(self): 
    self.request.session.set_test_cookie() 

def check_and_delete_test_cookie(self): 
    if self.request.session.test_cookie_worked(): 
     self.request.session.delete_test_cookie() 
     return True 
    return False 

def get(self, request, *args, **kwargs): 
    """ 
    Same as django.views.generic.edit.ProcessFormView.get(), but adds test cookie stuff 
    """ 
    self.set_test_cookie() 
    return super(LoginView, self).get(request, *args, **kwargs) 

Вот вид на success_url:

def hello(request): 
    return render(request,"draint_user/hello.html",{}) 

И вот мой hello.html (шаблон)

<body> 
{% if user.is_authenticated %} 
    <p>Welcome, {{ user.get_username }}. Thanks for logging in.</p> 
{% else %} 
    <p>Welcome, new user. Please log in.</p> 
{% endif %} 
</body> 

ответ

1

По умолчанию в контексте шаблона нет user. Вы можете добавить его вручную или добавить весь запрос в контекст, активировав контекстный процессор django.core.context_processors.request.

В ответ на комментарий:

  1. Вы можете определить get_context_data на ваш взгляд, чтобы добавить user объект в вашем контексте:

    def get_context_data(self, **kwargs): 
         # getting default context for view 
         context = super(LoginView, self).get_context_data(**kwargs) 
    
         # adding user into context 
         context['user'] = self.request.user 
    
         # returning new context 
         return context 
    
  2. Вы можете редактировать файл settings.py и добавить

    TEMPLATE_CONTEXT_PROCESSORS = (
        "django.contrib.auth.context_processors.auth", 
        "django.core.context_processors.debug", 
        "django.core.context_processors.i18n", 
        "django.core.context_processors.media", 
        "django.core.context_processors.static", 
        "django.core.context_processors.tz", 
        "django.contrib.messages.context_processors.messages", 
        "django.core.context_processors.request", 
    ) 
    

(это по умолчанию TEMPLATE_CONTEXT_PROCESSORS от Джанго 1.7 с добавлением django.core.context_processors.request в него), или если вы уже определили TEMPLATE_CONTEXT_PROCESSORS в настройках, просто добавьте django.core.context_processors.request в него. Теперь вы сможете получить доступ к request.user в каждом из ваших шаблонов.

+0

Я действительно не получить свою точку зрения. Я имею в виду, как мне это сделать, что-то делать в settings.py? – sajid

+0

См. Обновленный ответ – GwynBleidD

+1

Это просто неправда. Контекстный процессор 'auth', который по умолчанию и указан первым в приведенном ниже фрагменте настроек, добавляет' auth' в контекст. Запрос просто добавляет 'запрос'. –

0

На самом деле, чтение здесь: https://docs.djangoproject.com/en/1.7/topics/http/shortcuts/#render

визуализации() такая же, как вызов render_to_response() с аргументом context_instance, что заставляет использование RequestContext.

Таким образом, вы можете попробовать получить доступ к объекту пользователя в качестве request.user внутри шаблона

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