Django Modèle utilisateur, Ajout de la fonction
Je veux ajouter une nouvelle fonction au Modèle utilisateur par défaut de Django pour récupérer une liste associée de type de modèle.
Tel modèle Foo:
class Foo(models.Model):
owner = models.ForeignKey(User, related_name="owner")
likes = models.ForeignKey(User, related_name="likes")
........
#at some view
user = request.user
foos= user.get_related_foo_models()
Comment cela peut-il être réalisé?
3 réponses
Vous pouvez ajouter une méthode à la User
from django.contrib import auth
auth.models.User.add_to_class('get_related_foo_models', get_related_foo_models)
Assurez-vous que vous avez ce code dans le models.py ou un autre fichier qui est importé au démarrage de django.
Ceci est une mise à jour de la réponse de @Lakshman Prasad. Mais un exemple complet:
Créer un fichier monkey_patching.py
dans l'un de vos 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)
Et importez-le dans le fichier __init__.py
de l'application. ie::
#app/__init__.py
import monkey_patching
Il n'est pas inhabituel de remplacer le modèle utilisateur comme indiqué dans les documents: https://docs.djangoproject.com/es/1.9/topics/auth/customizing/#substituting-a-custom-user-model, donc, en tenant compte de cela, il est préférable d'obtenir la classe user model avec le code suivant:
from django.contrib.auth import get_user_model
UserModel = get_user_model()
Ensuite, vous pouvez utiliser ce UserModel
pour ajouter des fonctionnalités comme le suggère @ Lakshman Prasad: UserModel.add_to_class('get_related_foo_models', get_related_foo_models)
.
Pour que le code ne soit exécuté qu'une seule fois, je préfère utiliser Django application config classes ( https://docs.djangoproject.com/es/1.9/ref/applications/), donc un exemple de travail complet sera:
# 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)