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é?

22
demandé sur Ondrej Slinták 2010-05-30 23:13:53

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.

37
répondu Lakshman Prasad 2010-05-31 13:06:58

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
10
répondu simple_human 2014-07-10 03:53:03

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)
0
répondu jgsogo 2016-02-08 14:09:22