Пользовательский контекст в Django - PullRequest
1 голос
/ 17 октября 2011

У меня проблемы с аутентификацией пользователя для моего сайта django. У меня есть экран входа, который, кажется, работает. Когда пользователь нажимает кнопку входа в систему, я вызываю django.contrib.auth.login, и кажется, что он работает нормально. Однако на последующих страницах не известно, что есть пользователь, вошедший в систему. Пример {% user.is_authenticated %} имеет значение false. Есть также некоторые функции меню, которые я хочу сделать доступными для зарегистрированных пользователей, такие как my-account и logout. Эти функции недоступны, кроме как на странице входа. Что действительно странно.

Кажется, это проблема пользовательского контекста. Но я не уверен, как я должен передавать контекст, чтобы убедиться, что мой логин стабилен. Does anyone know at could be going on here? Any advice?

--------- часть base.html ------------

<!--- The following doesn't register even though I know I'm authenticated -->
{% if user.is_authenticated %}
            <div id="menu">
            <ul>
             <li><a href="/clist">My Customers</a></li>
             <li><a href="#">Customer Actions</a></li>
             <li><a href="#">My Account</a></li>
            </ul>
            </div>
{% endif %}

--------- my views.py -----------------

# Should I be doing something to pass the user context here
def customer_list(request):
   customer_list = Customer.objects.all().order_by('lastName')[:5]
   c = Context({
      'customer_list': customer_list,
      })
   t = loader.get_template(template)
   return HttpResponse(t.render(cxt))

Ответы [ 3 ]

3 голосов
/ 17 октября 2011

Если вы используете Django 1.3, вы можете использовать ярлык render(), который автоматически включает в себя RequestContext.

from django.shortcuts import render

def customer_list(request):
   customer_list = Customer.objects.all().order_by('lastName')[:5]
   return render(request, "path_to/template.html",
                 {'customer_list': customer_list,})

В этом случае вы можетесделайте еще один шаг и используйте общий ListView:

from django.views.generic import ListView

class CustomerList(Listview):
    template_name = 'path_to/template.html'
    queryset = Customer.objects.all().order_by('lastName')[:5]
2 голосов
/ 17 октября 2011

Использовать RequestContext .

1 голос
/ 17 октября 2011

Как предложил Даниэль, используйте RequestContext ... или лучше, просто используйте ярлык render_to_response :

from django.template import RequestContext
from django.shortcuts import render_to_response

def customer_list(request):
   customer_list = Customer.objects.all().order_by('lastName')[:5]
   return render_to_response(
         "path_to/template.html",
         {'customer_list':customer_list,}, 
         context_instance=RequestContext(request)) 
...