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

2πŸ‘

βœ…

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 πŸ™‚

πŸ‘€Bloeper

3πŸ‘

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))
πŸ‘€Ofri Raviv

2πŸ‘

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
πŸ‘€Peter Rowell

0πŸ‘

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

πŸ‘€Timo

0πŸ‘

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)

πŸ‘€Albert Visser

Leave a comment