Search code examples
djangotemplatestemplatetag

Django template tag + template with user.is_authenticated doesn't work


I have a strange problem, in my settings file everything is enabled that needs to be enabled for user.is_authenticated use in a template.

I have the following template tag code:

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 )

And the template (menu.html) is as follows:

{% 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 %}

But it always returns Not logged in even when i am logged in... Does anybody has a clue what is wrong with this code?

Thanks in advance.

Greetings, Bloeper


Solution

  • First of all thanks for all the help. I found the solution thanks to all of you :) Turns out i needed to pass the request object in every view and needed to put it as an argument in my template tag. Solution code:

    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 )
    

    Thanks for al the help :)