Django регистрация и аутентификация через def

Пожалуйста, помогите мне с моей проблемой.

Мне нужно зарегистрировать пользователя с некоторыми дополнительными полями (телефон, адрес). Форма без поля имени пользователя. Авторизация через электронную почту. Предпочтительно использовать def. Я добавляю модель:

class Profile(models.Model):
  user = models.OneToOneField(User, on_delete=models.CASCADE)
  phone = models.IntegerField('phone ', null=True, blank=True)
  country = models.CharField('country ', max_length=100, null=True, blank=True)
  city = models.CharField('city ', max_length=100, null=True, blank=True)
  adress = models.CharField('adress', max_length=300, null=True, blank=True)
  zip_code = models.IntegerField('zip_code', null=True, blank=True)
  birth_day = models.DateField('birth_day', null=True, blank=True)
  avatar = models.ImageField('avatar', upload_to='avatar', null=True, blank=True)
  agreement = models.BooleanField('agreement', default=True)
  comment = models.TextField('comment', max_length=3000, null=True, blank=True)

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

  def admin_display(self):
    return self.user.last_name + ' ' + self.user.first_name

И добавьте две формы:

class ProfileForm(forms.ModelForm):
  class Meta:
    model = Profile
    exclude = ('comment', 'register_date', 'avatar', 'password', )
    widgets = {
      'phone': forms.NumberInput(attrs={'placeholder': '9XXXXXXXXX', 'class': 'form-control', 'id': 'phone'}),
      'country': forms.TextInput(attrs={'placeholder': 'Россия', 'class': 'form-control', 'id': 'country'}),
      'city': forms.TextInput(attrs={'placeholder': 'Москва', 'class': 'form-control', 'id': 'city'}),
      'adress': forms.TextInput(attrs={'placeholder': 'Ленина 25', 'class': 'form-control', 'id': 'adress'}),
      'zip_code': forms.TextInput(attrs={'placeholder': '101000', 'class': 'form-control', 'id': 'zip_code'}),
      'agreement': forms.CheckboxInput(attrs={'class': 'form-check-input', 'id': 'flexSwitchCheckChecked'}),
      'birth_day': DateInput(attrs={'class': 'form-control', 'id': 'birth_day'}),
    }


class UserForm(forms.ModelForm):
  class Meta:
    model = User
    fields = '__all__'
    widgets = {
      'first_name': forms.TextInput(attrs={'placeholder': 'Иван', 'class': 'form-control', 'id': 'first_name'}),
      'last_name': forms.TextInput(attrs={'placeholder': 'Петров', 'class': 'form-control', 'id': 'last_name'}),
      'email': forms.EmailInput(attrs={'placeholder': 'ivan_petrov@email.ru', 'class': 'form-control', 'id': 'email'}),
      'password': forms.PasswordInput(attrs={'placeholder': 'Пароль', 'class': 'form-control', 'id': 'password'}),
    }

Здесь просмотр:

def registration(request):
  if request.method == 'POST':
    form = UserForm(request.POST)
    if form.is_valid():
      instance = form.save(commit=False)
      instance.username = request.POST['email']
      instance.set_password(request.POST['password'])
      instance.save()
      return redirect('registration')
    else:
      form = UserForm(request.POST)
      profile_form = ProfileForm(request.POST)
      context = {
        'form': form,
        'profile_form': profile_form,
      }
    return render(request, 'user_registration.html', context)
  else:
    form = UserForm()
    profile_form = ProfileForm()
    context = {
      'form': form,
      'profile_form': profile_form,
    }
    return render(request, 'user_registration.html', context)

Вы можете видеть, имя пользователя скопировано из электронной почты. Но это не работает. Последний результат: Для формы профиля: имя пользователя - обязательное поле дата_присоединения - обязательное поле Для формы пользователя: user - обязательное поле

Я просто не понимаю, как это работает, и не могу найти примеры. Plz help )

Back to Top