Как сделать автоматическое создание кастомной модели после регистрации в Django
У меня есть своя модель Profile.
models.py:
from django.db import models
from django.contrib.auth.models import User
from django.conf import settings
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
img = models.ImageField(default='default.jpg', upload_to='user_images')
phonenumber = models.CharField(max_length=20, default='+79999999999')
tg = models.CharField(max_length=100, default='@имя_пользователя')
access_telegram_master = models.BooleanField(default='0')
def __str__(self):
return f'Профайл пользователя {self.user.username}'
При регистрации я использую стандартную форму Django, после регистрации модель User заполняется, мне нужно, чтобы и моя модель Profile создавалась автоматически, и подставлялись значения, которые указанны в default.
forms.py:
from django import forms
from django.contrib.auth.models import User
from django.contrib.auth.forms import UserCreationForm
from .models import Profile
class UserOurRegistration(UserCreationForm):
username = forms.EmailField(required=True)
def __init__(self, *args, **kwargs):
super(UserOurRegistration, self).__init__(*args, **kwargs)
self.fields['first_name'].label = "Имя*"
self.fields['last_name'].label = "Фамилия*"
self.fields['username'].label = "Адрес электронной почты"
class Meta:
model = User
fields = ['username', 'first_name', 'last_name', 'password1', 'password2']
Ответы (1 шт):
Автор решения: nomnoms12
→ Ссылка
Можно воспользоваться сигналом post_save.
models.py:
from django.db import models
from django.db.models.signals import post_save
from django.dispatch import receiver
from django.core.exceptions import ObjectDoesNotExist
from django.contrib.auth.models import User
@receiver(post_save, sender=User)
def save_or_create_profile(sender, instance, created, **kwargs):
if created:
Profile.objects.create(user=instance)
else:
try:
instance.profile.save()
except ObjectDoesNotExist:
Profile.objects.create(user=instance)
Код также позволяет редактировать Profile через User.