Django更新配置文件视图 - 仅允许登录用户编辑自己的帐户

时间:2016-12-22 15:59:00

标签: django django-forms

我有一个 AbstractBaseUser 的Django模型,我已经制作了一个更新表单,用户可以在其中更新他们的个人资料信息,但是,我无法找到一种方法让登录的用户编辑他们的拥有个人资料。如果有人对如何解决这个问题有任何想法,请告诉我。提前致谢。 :)

如果您需要查看超出提供的代码,请与我们联系。

UpdateProfile视图(注意:'相同'视图有两个版本,我只是在寻找其中任何一个的解决方案。如果可能的话,我宁愿使用CBV,但是,我不是&# 39;注意使用FBV)

class UpdateProfile(generic.UpdateView):
    model = Designer
    form_class = UserUpdateForm
    success_url = reverse_lazy('home')
    template_name = 'main/profile_update.html'

def update_profile(request):

    user = request.user
    form = UserUpdateForm(request.POST, instance=user)
    form.actual_user = request.user
    if request.method == 'POST':
        if form.is_valid():
            form.save()
            return HttpResponseRedirect(reverse('update_profile_success'))
    else:
        form = UserUpdateForm()

    context = {'form': form, }
    return render(request, 'main/profile_update.html', context)

模型

class Designer(AbstractBaseUser, PermissionsMixin):
    email = models.EmailField(unique=True)
    username = models.CharField(max_length=25, unique=True)
    display_name = models.CharField(max_length=25)
    twitter = models.CharField(max_length=15)
    bio = models.TextField(max_length=145, blank=True, default="")
    avatar = models.ImageField(upload_to='img', default='img/default_profile_pic.jpg')
    up_votes = models.IntegerField(default=0)
    available = models.BooleanField(default=False)
    thumbnail_price = models.FloatField(null=True)
    channel_art_price = models.FloatField(null=True)
    monthly = models.BooleanField(default=False)
    promoted = models.BooleanField(default=False)
    date_joined = models.DateTimeField(default=timezone.now)
    is_active = models.BooleanField(default=True)
    is_staff = models.BooleanField(default=False)

    objects = UserManager()

    USERNAME_FIELD = "email"
    REQUIRED_FIELDS = ["display_name", "username"]

形式

class UserUpdateForm(forms.ModelForm):
    class Meta:
        fields = ('username', 'email', 'avatar', 'display_name', 'twitter', 'bio', 'available',
              'monthly', 'thumbnail_price', 'channel_art_price')
        model = get_user_model()     

感谢。所有帮助表示赞赏:)

1 个答案:

答案 0 :(得分:3)

基于函数的视图应该只是工作。如果您使用login_required装饰器来确保用户已登录,那么设置instance=request.user就足够了。您不需要form.actual_user = request.user

from django.contrib.auth.decorators import login_required

@login_required
def update_profile(request):
    user = request.user
    form = UserUpdateForm(request.POST, instance=user)

    if request.method == 'POST':
       ...

对于基于类的视图,使用LoginRequiredMixin(需要Django 1.9+)以确保用户已登录,然后覆盖get_object以使用self.request.user

from django.contrib.auth.mixins import LoginRequiredMixin

class UpdateProfile(LoginRequiredMixin, generic.UpdateView):
    model = Designer
    form_class = UserUpdateForm
    success_url = reverse_lazy('home')
    template_name = 'main/profile_update.html'

    def get_object(self):
        return self.request.user