Override default get_absolute_url on User objects?

Question:

I’m trying to make a generic table for listing django_tables objects. I’ve got everything working, except that the get_absolute_urls() on my User objects returns:

/users/<username>/

While I could create this URL, it doesn’t match with the rest of the site layout, so I’m looking for another way to do this. Is there a way to override this value without breaking the built in authentication and other functionality?

Asked By: Jack M.

||

Answers:

You can do this in your settings.py file using the setting ABSOLUTE_URL_OVERRIDES

ABSOLUTE_URL_OVERRIDES = {
    'auth.user': lambda u: "/users/%s/" % u.username,
}

Here’s a link to the official docs: https://docs.djangoproject.com/en/stable/ref/settings/

Answered By: Mark Lavin

As a side note:

Since django v1.7 the django.contrib.auth.models.AbstractUser no longer defines a get_absolute_url() method (see release notes).

So the OP’s problem will not exist with django > v1.7 as you anyways need to define your custom get_absolute_url() method.

Now there are two way to do this:

  1. Define a get_absolute_url() method in your User model extension.
  2. Use the solution from Mark Lavin’s answer to create (not overwrite) the User.get_absolute_url() through the ABSOLUTE_URL_OVERRIDES setting.
Answered By: jojo