仅由配置文件所有者使用显示错误的 UserPassesTestMixin 访问编辑配置文件?
Access editing profile only by profile owner using UserPassesTestMixin showing error?
我已经成功地为每个用户创建了个人资料页面,每个用户都应该编辑自己的个人资料。在模型中,我使用了 AbstractUser 模型。对于编辑权限,我导入了 UserPassesTestMixin。
这是我的 models.py:
class Profile(AbstractUser):
name=models.CharField(max_length=30, blank=True)
bio = models.TextField(max_length=500, blank=True)
location = models.CharField(max_length=30, blank=True)
birthdate = models.DateField(null=True, blank=True)
这是我的 views.py:
class ProfileDetailView(DetailView):
template_name='profile.html'
model=Profile
def get_user_profile(self,pk):
return get_object_or_404(Profile,pk=pk)
class ProfileEditView(LoginRequiredMixin,UserPassesTestMixin,UpdateView):
model=Profile
template_name='profile_edit.html'
fields=['name','bio','birthdate','location','gender',]
login_url='login'
success_url = reverse_lazy('home')
def get_user_profile_edit(self,pk):
return get_object_or_404(Profile,pk=pk)
def test_func(self):
obj = self.get_object()
return obj.username == self.request.user
问题是当登录用户想要编辑其个人资料时,它显示 403 禁止。没有用户可以编辑他们的个人资料。在测试功能中应该使用什么来解决这个问题?
因为Profile
是用户模型,所以obj
应该是request.user
:
class ProfileEditView(LoginRequiredMixin, UserPassesTestMixin, UpdateView):
model=Profile
template_name='profile_edit.html'
fields=['name','bio','birthdate','location','gender',]
login_url='login'
success_url = reverse_lazy('home')
def get_user_profile_edit(self,pk):
return get_object_or_404(Profile,pk=pk)
def test_func(self):
return <b>self.get_object() == self.request.user</b>
然而你本身并不需要这个,你可以简单地使用 request.user
作为对象本身:
class ProfileEditView(LoginRequiredMixin, UpdateView):
model=Profile
template_name='profile_edit.html'
fields=['name','bio','birthdate','location','gender',]
login_url='login'
success_url = reverse_lazy('home')
def <b>get_object</b>(self, *args, **kwargs):
return <b>self.request.user</b>
在这种情况下,视图 不需要 主键,因为访问该视图的人只会看到他们自己的个人资料进行编辑。
我已经成功地为每个用户创建了个人资料页面,每个用户都应该编辑自己的个人资料。在模型中,我使用了 AbstractUser 模型。对于编辑权限,我导入了 UserPassesTestMixin。
这是我的 models.py:
class Profile(AbstractUser):
name=models.CharField(max_length=30, blank=True)
bio = models.TextField(max_length=500, blank=True)
location = models.CharField(max_length=30, blank=True)
birthdate = models.DateField(null=True, blank=True)
这是我的 views.py:
class ProfileDetailView(DetailView):
template_name='profile.html'
model=Profile
def get_user_profile(self,pk):
return get_object_or_404(Profile,pk=pk)
class ProfileEditView(LoginRequiredMixin,UserPassesTestMixin,UpdateView):
model=Profile
template_name='profile_edit.html'
fields=['name','bio','birthdate','location','gender',]
login_url='login'
success_url = reverse_lazy('home')
def get_user_profile_edit(self,pk):
return get_object_or_404(Profile,pk=pk)
def test_func(self):
obj = self.get_object()
return obj.username == self.request.user
问题是当登录用户想要编辑其个人资料时,它显示 403 禁止。没有用户可以编辑他们的个人资料。在测试功能中应该使用什么来解决这个问题?
因为Profile
是用户模型,所以obj
应该是request.user
:
class ProfileEditView(LoginRequiredMixin, UserPassesTestMixin, UpdateView):
model=Profile
template_name='profile_edit.html'
fields=['name','bio','birthdate','location','gender',]
login_url='login'
success_url = reverse_lazy('home')
def get_user_profile_edit(self,pk):
return get_object_or_404(Profile,pk=pk)
def test_func(self):
return <b>self.get_object() == self.request.user</b>
然而你本身并不需要这个,你可以简单地使用 request.user
作为对象本身:
class ProfileEditView(LoginRequiredMixin, UpdateView):
model=Profile
template_name='profile_edit.html'
fields=['name','bio','birthdate','location','gender',]
login_url='login'
success_url = reverse_lazy('home')
def <b>get_object</b>(self, *args, **kwargs):
return <b>self.request.user</b>
在这种情况下,视图 不需要 主键,因为访问该视图的人只会看到他们自己的个人资料进行编辑。