Шаблон Django тег + шаблон с user.is_authenticated не работает - PullRequest
3 голосов
/ 17 января 2010

У меня странная проблема, в моем файле настроек включено все, что нужно включить для использования user.is_authenticated в шаблоне.

У меня есть следующий код тега шаблона:

from django import template
from progmatic.cms.models import navigation, navigation_item
from django.template.defaultfilters import slugify
from django.shortcuts import render_to_response
from django.template import RequestContext

register = template.Library()

""" Gets the menu items you have entered in the admin.
 No arguments are accpeted"""

def get_hoofd_menu( ):
 menu = navigation.objects.get( slug = "hoofd-menu");
 mcontent = navigation_item.objects.filter( parent_menu = menu);
 return { 'mcontent' : mcontent }

def get_sub_menu( menu ):
 menu = navigation.objects.get( slug = slugify(menu) )
 mcontent = navigation_item.objects.filter( parent_menu = menu )
 c = RequestContext( request, { 'mcontent': mcontent,} )

 return render_to_reponse('menu.html', RequestContext(request, { 'mcontent' : mcontent }) )

register.inclusion_tag('menu.html')( get_hoofd_menu )
register.inclusion_tag('menu.html')( get_sub_menu )

А шаблон (menu.html) выглядит следующим образом:

{% block mainmenu %}
    <ul>
     {% for content in mcontent %}
      {% if content.login_required %}
       {% if content.to_page %}
        <li><a href="/page/{{ content.to_page_slug }}">{{ content.name }}</a></li>
       {% endif %}
       {% if content.to_url %}
        {% if content.external %}
         <li><a href="{{ content.to_url }}" rel="external">{{ content.name }}</a></li>
        {% else %}
         <li><a href="{{ content.to_url }}">{{ content.name }}</a></li>
        {% endif %}
       {% endif %}
      {% else %}
       {% if content.to_page %}
        <li><a href="/page/{{ content.to_page_slug }}">{{ content.name }}</a></li>
       {% endif %}
       {% if content.to_url %}
        {% if content.external %}
         <li><a href="{{ content.to_url }}" rel="external">{{ content.name }}</a></li>
        {% else %}
         <li><a href="{{ content.to_url }}">{{ content.name }}</a></li>
        {% endif %}
       {% endif %}
      {% endif %}
     {% endfor %}
    </ul>
    {% if user.is_authenticated %}
    JEEEEEEEJ LOGGED IN
    {% else %}
    Not logged in
    {% endif %}
    {% endblock %}

Но всегда возвращается Не залогинен, даже когда я залогинен ... Кто-нибудь знает, что не так с этим кодом?

Заранее спасибо.

Привет, Bloeper

Ответы [ 5 ]

3 голосов
/ 17 января 2010

У вас есть django.core.context_processors.auth in TEMPLATE_CONTEXT_PROCESSORS настройка?

Еще одна вещь, которую стоит попробовать - это ваш синтаксис render_to_reponse. согласно документации, это должно быть

return render_to_response('my_template.html',
                          my_data_dictionary,
                          context_instance=RequestContext(request))
2 голосов
/ 17 января 2010

Прежде всего спасибо за помощь.Я нашел решение благодаря всем вам :) Оказывается, мне нужно было передавать объект запроса в каждом представлении, и мне нужно было поместить его в качестве аргумента в мой тег шаблона.Код решения:

from django import template
from progmatic.cms.models import navigation, navigation_item
from django.template.defaultfilters import slugify
from django.shortcuts import render_to_response
from django.template import RequestContext
from itertools import chain

register = template.Library()

""" Gets the menu items you have entered in the admin.
 No arguments are accepted"""

def get_hoofd_menu( request ):
 menu = navigation.objects.get( slug = "hoofd-menu");
 mcontent = navigation_item.objects.filter( parent_menu = menu, login_required = False);

 if request.user.is_authenticated and not request.user.is_anonymous():
  mmcontent = navigation_item.objects.filter( parent_menu = menu, login_required = True )
 else:
  mmcontent = ""

 final_menu = list(chain(mcontent,mmcontent))

 return { 'mcontent' : final_menu }
 #return render_to_response('menu.html', { 'mcontent' : mcontent } )

def get_sub_menu( request, menu ):
 menu = navigation.objects.get( slug = slugify( menu ) )
 mcontent = navigation_item.objects.filter( parent_menu = menu, login_required = False )
 if request.user.is_authenticated and not request.user.is_anonymous():
  mmcontent = navigation_item.objects.filter( parent_menu = menu, login_required = True )
 else:
  mmcontent = ""

 final_menu = list(chain(mcontent,mmcontent))

 return { 'mcontent' : final_menu }
 #return render_to_response('menu.html', { 'mcontent' : mcontent })

register.inclusion_tag('menu.html')( get_hoofd_menu )
register.inclusion_tag('menu.html')( get_sub_menu )

Спасибо за помощь:)

2 голосов
/ 17 января 2010

У вас есть другие зарегистрированные контекстные процессоры? Они устанавливают user?

Я рекомендую работать под сервером dev и делать что-то вроде:

rc = RequestContext(request, ... params ...)
user = rc.get('user')
print user.username, user.is_authenticated()

Если вы не получили ожидаемых значений, вам нужно копать глубже. Следующее должно пройти через все контекстные диктовки и показать, какие из них содержат значение для «пользователя». Первым будет то, что видит шаблон.

rc = RequestContext(request, ... params ...)
for d in rc:
    print d
0 голосов
/ 17 января 2010

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

from django.contrib.auth.decorators import login_required

и украсьте все виды, где это важно, например:

@login_required
def get_hoofd_menu( ):

все это упоминается в обзоре (чуть выше на полпути)

0 голосов
/ 17 января 2010

есть ли в вашем файле настроек django.contrib.auth и django.contrib.sessions?

...