我正在尝试在创建新用户时创建配置文件,但是我对此并不陌生,我很迷失。我不确定自己是否要创建个人资料,如果我自己,我不知道如何在创建个人资料后对其进行编辑。任何帮助表示赞赏。
我还不完全了解如何将个人资料链接到用户,并且我很难理解信号...还要为糟糕的文档表示歉意,我至少没有做出任何一致的决定
forms.py
class CustomUserCreationForm(UserCreationForm):
class Meta(UserCreationForm):
model = CustomUser
fields = ('email',)
class CustomUserChangeForm(UserChangeForm):
class Meta:
model = CustomUser
fields = ('email',)
class ProfileForm(forms.ModelForm):
class Meta:
model = Profile
fields = ['bio','specialty', 'style',]
class EditProfileForm(ModelForm):
class Meta:
model = Profile
fields = ('bio', 'specialty', 'style',)
models.py
class CustomUser(AbstractBaseUser, PermissionsMixin):
email = models.EmailField(_('email address'), unique=True)
is_staff = models.BooleanField(default=False)
is_active = models.BooleanField(default=True)
date_joined = models.DateTimeField(default=timezone.now)
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = []
objects = CustomUserManager()
def __str__(self):
return self.email
class Profile(models.Model):
user = models.OneToOneField('accounts.CustomUser', on_delete=models.CASCADE)
bio = models.TextField(max_length=500, blank=True)
specialty = models.CharField(max_length=150, blank=True)
style = models.CharField(max_length=150, blank=True)
def create_profile(sender, instance, created, **kwargs):
if created:
user_profile = Profile.objects.create(user=instance)
post_save.connect(create_profile, sender=CustomUser)
signals.py
@receiver(post_save, sender=User)
def save_profile(sender, instance, created, **kwargs):
user = instance
if created:
profile = ProfileForm()
profile.save()
@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
if created:
profile, created = Profile.objects.get_or_create(user=instance)
@receiver(post_save, sender=User)
def save_user_profile(sender, instance, **kwargs):
instance.profile.save()
views.py
def home(request):
return render(request, 'home.html')
def dashboard(request):
return render(request, "accounts/dashboard.html")
class SignUp(generic.CreateView):
form_class = CustomUserCreationForm
success_url = reverse_lazy('login')
template_name = 'sign_up.html'
@login_required
@transaction.atomic
def update_profile(request):
if request.method == 'POST':
user_form = CustomUserCreationForm(request.POST, instance=request.user)
profile_form = ProfileForm(request.POST, instance=request.user.profile)
if user_form.is_valid() and profile_form.is_valid():
user_form.save()
profile_form.save()
messages.success(request, _('Your profile was successfully updated!'))
return redirect('settings:profile')
else:
messages.error(request, _('Please correct the error below.'))
else:
user_form = CustomUserCreationForm(instance=request.user)
profile_form = ProfileForm(instance=request.user.profile)
return render(request, 'accounts/profile.html', {
'user_form': user_form,
'profile_form': profile_form
})
def edit_profile(request):
if request.method == 'POST':
form = EditProfileForm(request.POST, instance=request.user)
profile_form = ProfileForm(request.POST, request.FILES, instance=request.user.userprofile) # request.FILES is show the selected image or file
if form.is_valid() and profile_form.is_valid():
user_form = form.save()
custom_form = profile_form.save(False)
custom_form.user = user_form
custom_form.save()
return redirect('accounts:profile')
else:
form = EditProfileForm(instance=request.user)
profile_form = ProfileForm(instance=request.user.user_profile)
args = {}
# args.update(csrf(request))
args['form'] = form
args['profile_form'] = profile_form
return render(request, 'edit_profile.html', args)