我有一个 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()
感谢。所有帮助表示赞赏:)
答案 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