Question

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

Was it helpful?

Solution 3

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 :)

OTHER TIPS

Do you have django.core.context_processors.auth in TEMPLATE_CONTEXT_PROCESSORS setting?

Another thing to try is your render_to_reponse syntax. according to the docs, it should be

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

Do you have any other context processors registered? Do they set user?

I recommend running under the dev server and do something like:

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

If you don't get the values you expect, then you need to dig deeper. The following should iterate through all context dicts and show you which one(s) contain a value for 'user'. The first one will be what the template sees.

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

do you have django.contrib.auth and django.contrib.sessions in your settings file?

where is the actual code that checks if the user is authenticated? If you check for it in the template, you should provide some indivcation when passing parameters from the view to the template. For me it works when I do this at the top:

from django.contrib.auth.decorators import login_required

and decorate all the views where it's important, e.g:

@login_required
def get_hoofd_menu( ):

it's all mentioned in the overview (a little above halfway through)

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top