Как заполнить модель в конце регистрации пользователя - PullRequest
0 голосов
/ 27 июня 2019

У меня есть модель AuthCustomUser(AbstractUser) для регистрации нового пользователя.В нем будут сохранены необходимые данные для входа в систему, например: имя , электронная почта и пароль .

С другой стороны,У меня есть модель MetaUser (models.Model), которую я буду использовать для дополнительной информации пользователя, например: адрес , телефон и т. Д.

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

В модели MetaUser(models.Model) у меня есть внешний ключ:

user = models.ForeignKey (settings.AUTH_USER_MODEL, on_delete = models.CASCADE)

Когда пользователь зарегистрированданные будут введены в модель AuthCustomUser (AbstractUser), затем я хочу вставить идентификатор пользователя в модель MetaUser (models.Model), чтобы установить отношение внешнего ключа между обеими моделями.Наконец, пользователь начнет сеанс сразу после окончания регистрации, и ему будет предоставлен доступ к home.html.

Это мои модели:

class MetaUser(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    screen_orientation = models.CharField(default='landscape', max_length=9)

    def __str__(self):
        return self.name

class AuthCustomUser(AbstractUser):
    def __str__(self):
        return self.name

А вот мое мнениереестра:

class SignUp(generic.CreateView):
    form_class = CustomUserCreationForm
    success_url = reverse_lazy('login')
    template_name = 'signup.html'

    def form_valid(self, form):
        form.save()
        username = self.request.POST['username']
        password = self.request.POST['password1']
        user = authenticate(username=form.cleaned_data['username'], password=form.cleaned_data['password1'],)
        login(self.request, user)
        if self.request.user.is_authenticated:
            metaUser = MetaUser(user=self.request.user.id)
            metaUser.save()
        else:
            return render(self.request, 'home.html', {})

У меня не может быть ID, вставленный в поле внешнего ключа во время регистрации.

1 Ответ

0 голосов
/ 27 июня 2019

Конечно, вы можете иметь идентификатор пользователя. Вы можете сделать это так:

def form_valid(self, form):
    form.save()
    user = authenticate(username=form.cleaned_data['username'], password=form.cleaned_data['password1'],)
    login(self.request, user)
    metaUser = MetaUser(user=user, screen_orientation='some value')
    metaUser.save()
    return render(self.request, 'home.html', {})

Кроме того, вам необходимо убедиться, что вновь созданный пользователь активен, иначе аутентификация не вернет объект пользователя. Чтобы убедиться, что пользователь активен, вы можете переопределить метод create_user внутри ModelManager. Например:

from django.contrib.auth.models import UserManager

class CustomUserManager(UserManager):

    def _create_user(self, username, email, password, **extra_fields):
        """
        Create and save a user with the given username, email, and password.
        """
        if not username:
            raise ValueError('The given username must be set')
        email = self.normalize_email(email)
        username = self.model.normalize_username(username)
        user = self.model(username=username, email=email, **extra_fields)
        user.set_password(password)
        user.is_active=True
        user.save(using=self._db)
        return user

class AuthCustomUser(AbstractUser):
    objects = CustomUserManager()
    def __str__(self):
        return self.name

Кроме того, лучше иметь другое представление для рендеринга домашней страницы. Например:

def home(request):
    return render(self.request, 'home.html', {})

# url

path('home/', home, name="home")

# usage in SignUp view

 def form_valid(self, form):
    ...
    return redirect('home')  # instead of render(self.request, 'home.html', {})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...