сохранить пользовательские данные в другой модели после регистрации пользователя django - PullRequest
0 голосов
/ 27 сентября 2019

У меня есть этот портал, на котором пользователь может зарегистрироваться как исполнитель, и я хочу сохранить этого пользователя на странице категории другого исполнителя после регистрации, например, если пользователь регистрируется как модель, он автоматически сохраняется на моделях исполнителей, поэтому его можно получить на странице художников

artist models.py:

from django.db import models
from django.contrib.auth.models import BaseUserManager, AbstractBaseUser, PermissionsMixin
from django.utils import timezone
from django.contrib.auth import get_user_model
from django.db.models.signals import post_save
from django_countries.fields import CountryField
from phonenumber_field.modelfields import PhoneNumberField

 class artist(models.Model):
     CHOICES = (
       (0, 'celebrities'),
       (1, 'singer'),
       (2, 'comedian'),
       (3, 'dancer'),
       (4, 'model'),
       (5, 'Photographer')
    )
    artist_name = models.CharField(max_length = 50)
    artist_type = models.IntegerField(choices = CHOICES)
    artist_image = models.ImageField(upload_to= 'media')
    description = models.TextField(max_length = 500)

    def __str__(self):
        return self.artist_name

Диспетчер пользовательских настроек

class UserManager(BaseUserManager):
    def _create_user(self, email, password, is_staff, is_superuser, **extra_fields ):
        if not email:
            raise ValueError('user must have email address')
        now = timezone.now()
        email = self.normalize_email(email)
        user = self.model(
            email = email,
            is_staff = is_staff,
            is_active = True,
            is_superuser = is_superuser,
            last_login=now,
            date_joined = now,
            **extra_fields
        )
        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_user(self,email, password, **extra_fields):
        return self._create_user(email, password, False, False, **extra_fields)

    def create_superuser(self, email, password, **extra_fields):
        user = self._create_user(email, password, True, True, **extra_fields)
        user.save(using=self._db)
        return user

Модель пользовательских настроек

class CustomUser(AbstractBaseUser, PermissionsMixin):
    artist_choice = [
        (0, 'celebrities'),
        (1, 'singer'),
        (2, 'comedian'),
        (3, 'dancer'),
        (4, 'model'),
        (5, 'Photographer')

    ]
    Artist_Category = models.IntegerField(choices=artist_choice, null=True)
    Mobile_Number = PhoneNumberField(null=True)
    city = models.CharField(blank=True, max_length=50)
    bio = models.TextField(blank=True)
    email = models.EmailField(max_length=100, unique=True)
    name = models.CharField(max_length=100)
    is_staff = models.BooleanField(default=False)
    is_active = models.BooleanField(default=True)
    is_superuser = models.BooleanField(default=False)
    last_login=models.DateTimeField(null=True, blank=True)
    date_joined = models.DateTimeField(auto_now_add=True)
    country = CountryField()
    USERNAME_FIELD = 'email'
    EMAIL_FIELD='email'
    REQUIRED_FIELDS=[]

    objects=UserManager()

    def get_absolute_url(self):
        return "/users/%i/" % (self.pk)

views.py:

def talent(request, artist_type):
    artists = artist.objects.filter(artist_type = artist_type)
    context = {
             'aka': artists
    }
    return render(request, 'main_site/talent.html', context)

forms.py:

class RegistrationForm(UserCreationForm):
    CHOICES = (
        (0, 'celebrities'),
        (1, 'singer'),
        (2, 'comedian'),
        (3, 'dancer'),
        (4, 'model'),
        (5, 'Photographer')
    )
    #Artist_Category = forms.ChoiceField(choices=CHOICES)
    #bio = forms.CharField(widget=forms.Textarea,label = 'something about yourself')



    class Meta:
        model = CustomUser
        fields = ('email','name','Mobile_Number','Artist_Category','country','bio','city')

я также добавил в панель администратора модели для создания художника

admin artist

и когда пользователь регистрируется, он автоматически сохраняется на этой модели

1 Ответ

0 голосов
/ 27 сентября 2019

Если вы хотите создать экземпляр модели художника при создании / регистрации пользователя.Рассмотрим «Расширение пользовательской модели Django».Это можно сделать с помощью отношения «один к одному» или с помощью модели «Прокси-пользователь».

Пример модели «Один к одному»:

class Artist(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    # Your artist fields

Затем можно добавить несколько сигналов для обновления.модель художника при регистрации / изменении пользователя.

@receiver(post_save, sender=User)
def create_user_artist(sender, instance, created, **kwargs):
    if created:
        Artist.objects.create(user=instance)

@receiver(post_save, sender=User)
def save_user_artist(sender, instance, **kwargs):
    instance.artist.save()

При этом, если пользователь создан или обновлен, будет вызван соответствующий сигнал, обновляющий экземпляр модели художника.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...