views:

721

answers:

5

Hi all,

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

A: 

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

Tom
Yep both are in my installed app list
Bloeper
strange. are you sure you are logedin? do you login with the login() function?
Tom
Yes i am sure i am logged in, i use the login function.But when i change the if user.is_authenticated to if not user.....Then i get the always the message Jeeej logged in.. So the user.is_authenticated doesn't function to well.
Bloeper
weird, very weird. i don't now anything else. sorry...edit: maybe you can try request.user.is_authenticated instead of user.is_authenticated ?
Tom
+3  A: 

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
Yep i have all the necessary stuff for it in my settings file (as far as i could read it in the django docs
Bloeper
(added another thing to check for)
Ofri Raviv
Well that whas the code in the first place...But i tried it this way with no avail.
Bloeper
A: 

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
That's not what i meant...It's not a view... It's a templatetag, and the login isn't required, i only use it for some items in which the login is required.
Bloeper
I forgot to mention you have to pass in the request containing the user to the view, so that it too can be passed along to the template (i.e. define the view as "get_hoofd_menu(request):"),perhaps that's the important part
Albert Visser
Thanks for the help, but tried that already with no avail :(
Bloeper
+1  A: 

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
I'm running the dev server, but when i print something in it i don't see it in the console.I only run the default context processors
Bloeper
Hmmm ... You should see *something*. Trying sticking in a simple `print "Foo!"` at the start of your view. If this doesn't show then something is weird. Also, what platform (Windows, Linux, Mac)? which Python version? Which Django version?
Peter Rowell
print "x" doenst work either.. And it ain't a view its a templatetag.I work on linux, with python 2.6 and django version 1.1.1hmm does return stuff now :S
Bloeper
Sorry, I was unclear. The code above needs to be done *in the view*. You have to know that the context values going into the template engine are what they need to be. If the goes-in-to ain't right, then the comes-out-of is basically guacamole. Also, it's very strange that you aren't getting print values from inside your templatetag processing. I just did print checks from inside mine and they printed out on the console just fine.
Peter Rowell
+1  A: 

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