2010-01-17 2 views
3

У меня странная проблема, в моем файле настроек все включено, которое должно быть включено для использования пользователем.is_authenticated в шаблоне.Шаблон шаблона Django + шаблон с 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

+0

Обновления: код и то же (один я отправил ... Но теперь я получаю сообщение об ошибке ... Так что это улучшение.В нем написано: Обнаружено исключение при рендеринге: глобальное имя «запрос» не определено И это в части рендеринга ответу :) – Bloeper

ответ

2

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

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) 

Спасибо за А.Л. помощью :)

+0

, но тогда как вы можете убрать ур-тег в шаблоне, вам нужно дать ему параметр запроса! '{% get_hoofd_menu request%}' правильно? как вы получите запрос в шаблоне? – Armance

0

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

+0

Да, оба в моем списке установленных приложений – Bloeper

+0

странно. ты уверен, что ты зарегистрирован? вы входите в систему с функцией login()? – Timo

+0

Да, я уверен, что я вошел в систему, я использую функцию входа. Но когда я изменяю if user.is_authenticated, если не пользователь ..... Тогда я получаю всегда сообщение Jeeej, входящее в систему. Таким образом, user.is_authenticated не работает хорошо. – Bloeper

3

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

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

return render_to_response('my_template.html', 
          my_data_dictionary, 
          context_instance=RequestContext(request)) 
+0

У меня есть все необходимое для этого в моем файле настроек (насколько я мог прочитать его в django docs – Bloeper

+0

(добавлено еще одно, что нужно проверить) –

+0

Хорошо, что именно код в первую очередь ... Но Я пробовал это так, но безрезультатно. – Bloeper

0

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

from django.contrib.auth.decorators import login_required 

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

@login_required 
def get_hoofd_menu(): 

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

+0

Это не то, что я имел в виду ... Это не представление ... Это шаблон, и логин не требуется, я использую его только для некоторых элементов, в которых логин – Bloeper

+0

Я забыл упомянуть, что вы должны передать запрос, содержащий пользователя, в представление, чтобы его тоже можно было передать вместе с шаблоном (т. е. определить представление как «get_hoofd_menu (request):»), , возможно, это важная часть –

+0

Спасибо за помощь, но пробовал это уже безрезультатно :( – Bloeper

1

Есть ли у вас какие-либо другие обработчики контекста? Установили ли они user?

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

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

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

rc = RequestContext(request, ... params ...) 
for d in rc: 
    print d 
+0

Я запускаю dev-сервер, bu t, когда я что-то печатаю, я не вижу его в консоли. Я запускаю только контекстные процессоры по умолчанию – Bloeper

+0

Хммм ... Вы должны увидеть * что-то *. Попытка вставить в простой 'print 'Foo!" 'В начале вашего просмотра. Если это не показывает, то что-то странно. Кроме того, какая платформа (Windows, Linux, Mac)? какая версия Python? Какая версия Django? –

+0

print "x" doenst work либо .. И это не взгляд его templatetag. Я работаю над linux, с python 2.6 и версией django 1.1.1 hmm действительно возвращает материал сейчас: S – Bloeper

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