如何在Django中创建和编辑用户个人资料?

时间:2020-11-12 00:24:30

标签: python django

我正在尝试在创建新用户时创建配置文件,但是我对此并不陌生,我很迷失。我不确定自己是否要创建个人资料,如果我自己,我不知道如何在创建个人资料后对其进行编辑。任何帮助表示赞赏。

我还不完全了解如何将个人资料链接到用户,并且我很难理解信号...还要为糟糕的文档表示歉意,我至少没有做出任何一致的决定

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)

0 个答案:

没有答案
相关问题