Django: Как создать пользователя и установить соответствующее поле - PullRequest
0 голосов
/ 07 апреля 2020

Я расширил пользовательские данные, используя другую модель (отношение OneToOne), и когда пользователь создается, его профиль также создается. Я хотел бы обновить поле mailing , когда пользователь создается без запроса.

models.py

class Profile(models.Model):
    user         = models.OneToOneField(User, on_delete=models.CASCADE)
    mailing      = models.BooleanField(default=False)

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

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

views.py

def register(request):
    ...   
     if user_form.is_valid() and profile_form.is_valid():
        user = user_form.save(commit=False)
        user.mailing = profile_form.cleaned_data['mailing']
        user.save() #The user is created but mailing is not set
        return redirect('login')

profile_backend.py

class ProfileBackend(ModelBackend):
    def get_user(self, user_id):
        UserModel = get_user_model()
        try:
            return UserModel._default_manager.select_related('profile').get(pk=user_id)
        except UserModel.DoesNotExist:
            return None

Я могу установить переменную, принимая пользователя за объект, но это подразумевает использование дополнительного функция.

1 Ответ

0 голосов
/ 07 апреля 2020
@receiver(post_save, sender=User)
def create_or_update_user_profile(sender, instance, created, **kwargs):
    if created:
        profile_id = uuid.uuid1().hex #for unique id if any
        Profile.objects.create(user=instance,profile_id=profile_id)
    instance.profile.save()

Это один из моих примеров кода. Это может вам помочь.

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