Как связать пользователя с моделью django сразу после создания пользователя? - PullRequest
1 голос
/ 08 мая 2020

Я новичок в Django, и мой вопрос: как связать Django User с моделью Climber, которую я создал, как только пользователь будет зарегистрирован? Пока что я могу зарегистрировать новый User с помощью встроенной формы регистрации пользователя Django. Но когда я go захожу на свою страницу администратора, я вижу, что мне нужно создать новый Climber вручную и выбрать, на какой User я хочу, чтобы он ссылался. Заранее спасибо!

class Climber(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    grades = [('v'+str(i),'v'+str(i))for i in range(0,13)]
    highest_grade = models.CharField(max_length=3, choices=grades, default='v0')
    team = models.ForeignKey(Team, null=True, on_delete=models.SET_NULL)
    climbs_completed = models.ManyToManyField(Climb, blank=True)

    def __str__(self):
        return self.user.username

    # for each climbs_completed, sum up the points
    def total_score(self):
        pass

Ответы [ 2 ]

5 голосов
/ 08 мая 2020

Вы можете сделать это с помощью сигналов .

Пример:

from django.contrib.auth import get_user_model
from django.db.models.signals import post_save
from django.dispatch import receiver
from myapp.models import Climber

User = get_user_model()


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

Другой способ - переопределить метод clean() или save() из User -модель, считается, что вы сами имеете кастомную модель пользователя.

1 голос
/ 08 мая 2020

Вы должны использовать сигналы

функцию Create в моделях Climber

@receiver(post_save, sender=User)
def link_climber(sender, instance, created, **kwargs):
    """ If new user is created, create climber for him """
    if created:
        Climber.objects.create(user=instance)
...