0

How do I override the .save() method for the model which uses get_user_model?

forms.py

from django.contrib.auth import get_user_model
from django.contrib.auth.forms import UserCreationForm
from django import forms

class UserCreateForm(UserCreationForm):
    class Meta:
        fields = ("first_name", "last_name", "username", "email", "password1", "password2")
        model = get_user_model()

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields["username"].label = "Username"
        self.fields["email"].label = "Email address"

On creation of user I want to send user data into another model. As it has no written model (rather I'm importing it as from django.contrib.auth import get_user_model), how do I override the save method like-

def save(self, *args, **kwargs):
        super(Model, self).save()
        Record.objects.create(
        employee_ID = self.employee_ID,
        first_name = self.first_name,
        last_name = self.last_name)

where my Record model is -

class Record(models.Model):

    first_name = models.CharField(max_length = 50)
    last_name = models.CharField(max_length = 50)
    employee_ID = models.CharField(max_length = 20)
  • 1
    You cannot override and should not monkey-patch a third-party model's save method. Rather connect a handler to the [post_save](https://docs.djangoproject.com/en/2.1/ref/signals/#post-save) signal. There, you have access to the User model (`sender`) and the instance (`instance`). – user2390182 Sep 05 '18 at 09:28
  • @schwobaseggl https://stackoverflow.com/questions/52177182/django-how-to-use-signals – John Richards Sep 05 '18 at 09:36
  • https://docs.djangoproject.com/en/2.1/topics/signals/#connecting-receiver-functions, https://docs.djangoproject.com/en/2.1/topics/signals/#connecting-to-signals-sent-by-specific-senders, https://stackoverflow.com/questions/2719038/where-should-signal-handlers-live-in-a-django-project – user2390182 Sep 05 '18 at 09:50

2 Answers2

0

you can try to use AbstractUser in django by

from django.contrib.auth.models import AbstractUser

and add a line in your settings.py

AUTH_USER_MODEL = "myapp.NewUser"

Inherited django user and add override the save method

class NewUser(AbstractUser):
    # your code
    def save(self, *args, **kwargs):
        super(Model, self).save()
        Record.objects.create(
        employee_ID = self.employee_ID,
        first_name = self.first_name,
        last_name = self.last_name)

and this isn't a right way to create Record and it will make your code more complex. Please try signal in django.

you can use User as your sender by

from django.contrib.auth.models import User

More about User please read the document

Henry
  • 176
  • 6
0

Use Signals,

from django.db.models.signals import post_save
from django.contrib.auth.models import User
import Record

def send_data(sender, instance, created, **kwargs):

    record = Record()
    record.employee_ID = instance.username
    record.first_name = instance.first_name
    ....


post_save.connect(receiver = send_data, sender= User)