Django post_save () сигнал для регистрации нового пользователя - PullRequest
0 голосов
/ 18 января 2019

Ниже приведено представление на основе классов createprofileview для регистрации нового пользователя и одновременного создания профиля этого пользователя.

class CreateProfileView(CreateView):
model = Profile

 def post(self, request):
    user_form = UserForm(request.POST)
    profile_form = ProfileForm(request.POST, request.FILES)
    if user_form.is_valid() and profile_form.is_valid(): 
        user_form.save()
        return HttpResponseRedirect(reverse('home', args=[]))
        messages.warning(request, 'Something went wrong in Venter, please try again')

 def get(self, request):
    user_form = UserForm()
    profile_form = ProfileForm()
    return render(request, './mysite/registration.html', {'user_form': user_form, 'profile_form': profile_form})

Я использовал сигнал post_save () вместе с моей моделью профиля следующим образом:

class Profile(models.Model):
  user = models.OneToOneField(
    User, 
    on_delete=models.CASCADE,
    primary_key = True
  )
  organisation_name = models.ForeignKey(
    Organisation,
    on_delete= models.CASCADE,
    null=True,
  )
  profile_picture = models.ImageField(
    upload_to='Organisation/Employee Profile Picture/%Y/%m/%d/', 
    null=True,
    blank=True,
  )
  phone_number = models.CharField(
    blank=True, 
    max_length=10
  )
def __str__(self):
    return self.user.username 

@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()

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

Вот такие формы.py:

  class UserForm(forms.ModelForm):
     class Meta:
       model = User
       fields = ('username', 'password', 'email', 'first_name', 'last_name')

  class ProfileForm(forms.ModelForm):
     class Meta:
      model = Profile
      fields = ('organisation_name', 'phone_number', 'profile_picture')

1 Ответ

0 голосов
/ 18 января 2019

Я не вижу смысла в сигнале создания профиля, потому что у вас уже есть ProfileForm для получения данных профиля. Я думаю, что вы можете избавиться от сигналов профиля и обновить вид, чтобы сохранить форму профиля напрямую. Как это:

if user_form.is_valid() and profile_form.is_valid():
     user = user_form.save()
     profile = profile_form.save(commit=False)
     profile.user = user
     profile.save()

     # rest of the code

Обновление

от комментариев

Вам необходимо установить пароль в пользовательском объекте. Вы можете сделать это в методе save вашей формы, переопределив его следующим образом (используя метод set_password ):

class UserForm(...):
    ...
    def save(self, **kwargs):
       user = super(UserForm, self).save(commit=False)
       password = self.cleaned_data.get('password')
       user.set_password(password)
       user.save()
       return user
...