46👍
You can add a method to the User
from django.contrib import auth
auth.models.User.add_to_class('get_related_foo_models', get_related_foo_models)
Make sure, you have this code within the models.py or some other file which gets imported in the startup of django.
14👍
This is an update of @Lakshman Prasad’s answer. But a full example:
create a file monkey_patching.py
in any of your apps
::
#app/monkey_patching.py
from django.contrib.auth.models import User
def get_user_name(self):
if self.first_name or self.last_name:
return self.first_name + " " + self.last_name
return self.username
User.add_to_class("get_user_name",get_user_name)
and import it in app’s __init__.py
file. ie::
#app/__init__.py
import monkey_patching
- [Django]-Can I access constants in settings.py from templates in Django?
- [Django]-Django Class Based View for both Create and Update
- [Django]-Django manage.py: Migration applied before its dependency
4👍
It’s not unusual to substitute user model as it is stated in the docs: https://docs.djangoproject.com/es/1.9/topics/auth/customizing/#substituting-a-custom-user-model, so, having this into account, it is better to get the user model class with the following code:
from django.contrib.auth import get_user_model
UserModel = get_user_model()
Afterwards, you can use this UserModel
to add functionality as @Lakshman Prasad suggests: UserModel.add_to_class('get_related_foo_models', get_related_foo_models)
.
In order to get the code executed only once I prefer to use Django application config classes (https://docs.djangoproject.com/es/1.9/ref/applications/), so a full working example will be:
# myapp/__init__.py
default_app_config = 'myapp.apps.MyAppConfig'
# myapp/apps.py
from django.apps import AppConfig
from django.contrib.auth import get_user_model
class MyAppConfig(AppConfig):
name = 'myapp'
verbose_name = 'MyApp'
def ready(self):
# Add some functions to user model:
def custom_function(self):
# Do whatsoever
pass
UserModel = get_user_model()
UserModel.add_to_class('custom_function', custom_function)
- [Django]-Why does Django Rest Framework discourage model level validation?
- [Django]-Override default get_absolute_url on User objects?
- [Django]-Can I Make a foreignKey to same model in django?
2👍
You can use a proxy model to add methods to the User model without changing it class.
from django.contrib.auth import models
class UserProxy(models.User):
class Meta:
proxy = True
def get_related_foo_models(self):
pass
Get an instance of the proxy model in view – models.UserProxy.objects.get(pk=request.user.pk)
To get an instance of the proxy model immediately from the request, you need to create a custom ModelBackend
as described in this question – Django – User proxy model from request.
Source https://docs.djangoproject.com/en/4.1/topics/db/models/#proxy-models
- [Django]-How do I use allow_tags in django 2.0 admin?
- [Django]-How to catch the MultipleObjectsReturned error in django
- [Django]-Split models.py into several files