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 )