30 Stimmen

Django User Modell, Funktion hinzufügen

Ich möchte eine neue Funktion zum Standard-Benutzermodell von Django hinzufügen, um eine verwandte Liste vom Typ Model abzurufen.

Solch ein Foo-Modell:

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()

Wie kann dies erreicht werden?

46voto

lprsd Punkte 80189

Sie können eine Methode zur User

from django.contrib import auth
auth.models.User.add_to_class('get_related_foo_models', get_related_foo_models)

Stellen Sie sicher, dass Sie diesen Code in der Datei models.py oder einer anderen Datei haben, die beim Start von Django importiert wird.

14voto

suhailvs Punkte 17111

Dies ist eine Aktualisierung der Antwort von @Lakshman Prasad. Aber ein vollständiges Beispiel:

eine Datei erstellen monkey_patching.py in einem Ihrer 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)

und importieren Sie es in die app's __init__.py Datei. d.h.::

#app/__init__.py
import monkey_patching

4voto

jgsogo Punkte 676

Es ist nicht ungewöhnlich, das Benutzermodell so zu ersetzen, wie es in den Dokumenten angegeben ist: https://docs.djangoproject.com/es/1.9/topics/auth/customizing/#substituting-a-custom-user-model Daher ist es besser, die Benutzermodellklasse mit dem folgenden Code zu erhalten:

from django.contrib.auth import get_user_model
UserModel = get_user_model()

Danach können Sie diese UserModel um die von @Lakshman Prasad vorgeschlagene Funktionalität hinzuzufügen: UserModel.add_to_class('get_related_foo_models', get_related_foo_models) .


Um den Code nur einmal ausführen zu lassen, bevorzuge ich die Verwendung von Django-Anwendungskonfigurationsklassen ( https://docs.djangoproject.com/es/1.9/ref/applications/ ), so dass ein voll funktionsfähiges Beispiel sein wird:

# 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)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X