2017-04-02 2 views
1

J'ai un système de connexion:Django Contexte Processeur Connexion Dans le numéro

def login(request): 
title = "Login" 
if request.user.is_authenticated(): 
    return HttpResponseRedirect('/') 
form = UserLoginForm(request.POST or None) 
if request.POST and form.is_valid(): 
    username = form.cleaned_data.get('username') 
    password = form.cleaned_data.get('password') 
    user = auth.authenticate(username=username, password=password) 
    if user: 
     auth.login(request, user) 
    return HttpResponseRedirect("/")# Redirect to a success page. 
return render(request, 'accounts/login.html', {'title':title, 'form': form }) 


def logout(request): 
    auth.logout(request) 
    return HttpResponseRedirect('/accounts/login') 

et il fonctionne très bien. Cependant, lorsque je tente d'ajouter dans un context_processor il cesse de fonctionner et me donne l'erreur suivante:

Environment: 


Request Method: GET 
Request URL: http://localhost:8000/accounts/login/ 

Traceback: 

File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/core/handlers/exception.py" in inner 
    39.    response = get_response(request) 

File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/core/handlers/base.py" in _get_response 
    187.     response = self.process_exception_by_middleware(e, request) 

File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/core/handlers/base.py" in _get_response 
    185.     response = wrapped_callback(request, *callback_args, **callback_kwargs) 

File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/utils/decorators.py" in _wrapped_view 
    149.      response = view_func(request, *args, **kwargs) 

File "/Users/andyxu/Documents/ece496-web/capstone/views.py" in login 
    22.  return render(request, 'accounts/login.html', {'title':title, 'form': form }) 

File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/shortcuts.py" in render 
    30.  content = loader.render_to_string(template_name, context, request, using=using) 

File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/template/loader.py" in render_to_string 
    68.  return template.render(context, request) 

File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/template/backends/django.py" in render 
    66.    return self.template.render(context) 

File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/template/base.py" in render 
    206.     with context.bind_template(self): 

File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/contextlib.py" in __enter__ 
    17.    return self.gen.next() 

File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/template/context.py" in bind_template 
    236.    updates.update(processor(self.request)) 

Exception Type: TypeError at /accounts/login/ 
Exception Value: 'NoneType' object is not iterable 

Voici mon context_processor.py:

from matchalgorithm.models import Profile 

def add_variable_to_context(request): 
    if(request.user.id): 
     profile = Profile.objects.filter(user_id = request.user.id).first() 
    return { 
     'main_profile': profile 
    } 

Fondamentalement, je veux simplement vérifier si l'utilisateur a un Profile sinon retour None. Je veux utiliser cette variable pour être passée dans mon base.html qui n'est pas restituée par aucune vue. Chose amusante, une fois que je suis logged in, ça marche bien!

Merci

Répondre

3

L'indentation sur votre processeur de contexte semble être éteint, il ne correspond pas à votre description. Je suppose que l'instruction return est à l'intérieur de l'instruction if, car elle correspond à la fois à votre description et à la traceback.

Le docs dire (Souligné par l'auteur):

A context processor has a very simple interface: It’s a Python function that takes one argument, an HttpRequest object, and returns a dictionary that gets added to the template context. Each context processor must return a dictionary.

Donc, si vous ne voulez pas ajouter quoi que ce soit au contexte, votre processeur doit retourner un dictionnaire vide au lieu de None:

def add_variable_to_context(request): 
    if(request.user.id): 
     profile = Profile.objects.filter(user_id = request.user.id).first() 
     return { 
      'main_profile': profile 
     } 
    return {} 
+0

Ahh, ça m'a complètement manqué. Merci! – anderish