Get user information in django templates

DjangoDjango AuthenticationDjango Registration

Django Problem Overview


What's the best way to get user information from a django template?

For example, if I just want to:

  1. If the user is logged in, display "Welcome [username]"
  2. Otherwise, display the login button.

I'm using django-registration/authentication

Django Solutions


Solution 1 - Django

An alternate method for current Django versions:

{% if user.is_authenticated %}
    <p>Welcome, {{ user.get_username }}. Thanks for logging in.</p>
{% else %}
    <p>Welcome, new user. Please log in.</p>
{% endif %}


Note:

  • Use request.user.get_username() in views & user.get_username in templates. Preferred over referring username attribute directly. Source
  • This template context variable is available if a RequestContext is used.
  • django.contrib.auth.context_processors.auth is enabled by default & contains the variable user
  • You do NOT need to enable django.core.context_processors.request template context processor.

Source : https://docs.djangoproject.com/en/dev/topics/auth/default/#authentication-data-in-templates

Solution 2 - Django

{% if request.user.is_authenticated %}Welcome '{{ request.user.username }}'
{% else %}<a href="{% url django.contrib.auth.login %}">Login</a>{% endif %}

and make sure you have the request template context processor installed in your settings.py:

TEMPLATE_CONTEXT_PROCESSORS = (
    ...
    'django.core.context_processors.request',
    ...
)

Solution 3 - Django

As per the question title, the following may come handy to someone. used the followings in my template:

Username: {{ user.username }}

User Full name: {{ user.get_full_name }}

User Group: {{ user.groups.all.0 }}

Email: {{ user.email }}

Session Started at: {{ user.last_login }}

Thanks :)

Solution 4 - Django

Firstly, First, if your fields changed their name, you must overwrite the functions (get_full_name(), get_short_name(), etc), in this way:

def get_full_name(self):
    return self.names + ' ' + self.lastnames

def get_short_name(self):
    return self.names

In the template, you can show it this way

{% if user.is_authenticated %}
<strong>{{ user.get_short_name }}</strong>
{% endif %}

these are the methods in authentication https://docs.djangoproject.com/es/2.1/topics/auth/customizing/

Solution 5 - Django

The following is a full working solution that takes also translations into consideration:

template.html:

{% blocktrans %}Welcome {{ USER_NAME }}!{% endblocktrans %}

context_processors.py:

def template_constants(request):
    return {
        'USER_NAME': '' if request.user.is_anonymous else request.user.first_name,
        # other values here...
    }

Remind to set your custom context_processors correctly in the settings.py:

TEMPLATES = [
    {
        # ...
        'OPTIONS': {
            'context_processors': [
                # ...
                'your_app.context_processors.template_constants',
            ],
        },
    },
]

And this is what you get in the django.po:

#: templates/home.html:11
#, python-format
msgid "Hi %(USER_NAME)s!"
msgstr "..."

A good practice is to keep the logic outside the templates: for this purpose you can easily customize the username displayed directly in the context_processors.py.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionRiver TamView Question on Stackoverflow
Solution 1 - DjangouserView Answer on Stackoverflow
Solution 2 - DjangoTimmy O'MahonyView Answer on Stackoverflow
Solution 3 - DjangoMohammadView Answer on Stackoverflow
Solution 4 - DjangoDiego Santa Cruz MendezúView Answer on Stackoverflow
Solution 5 - DjangoDosView Answer on Stackoverflow