views.py:
class ProfileView(DetailView):
model = User
template_name ="profile/profile_view.html"
class ProfileEdit(UserPassesTestMixin, UpdateView):
login_url = '/login/'
model = User
form_class = ProfileForm
template_name="profile/profile_new.html"
def test_func(request, user_id):
user = User.objects.get(pk=user_id)
if request.user == user.user:
return True
else:
return HttpResponse("<h1>You will not be able to edit other profiles</h1>")
urls.py
url(r'^(?P<pk>[0-9]+)/edit/$', ProfileEdit.as_view(), name='profile_edit')
我收到此错误:(test_func()缺少1个必需的位置参数:'user_id') This 帖子解决了我想要解决的同一问题。基于类的视图有什么不同吗?
答案 0 :(得分:2)
这种方法存在一些问题。
首先,与任何方法一样,它需要self
作为第一个参数。
其次,正如错误所述,调用此视图的代码不希望将user_id
作为参数传递。您应该像self.kwargs
中那样在基于类的视图中的任何其他位置获取该值。
第三,您尝试访问user
的{{1}}属性,但这并不存在。您可以直接比较用户,但实际上根本不需要查询用户模型;您只需将ID与当前用户的ID进行比较。
user
但是,你也应该问问自己这是否是正确的做法。不是在URL中传递用户ID,然后检查它与登录用户的ID相同,您可以完全省略ID并始终访问当前用户。您可以通过在视图中定义def test_func(self, request):
if request.user.id == int(self.kwargs['pk']):
...
来返回get_object
;然后,您可以删除UserPassesTestMixin,test_func和URL参数。
答案 1 :(得分:0)
我得到了我需要的答案。
views.py
class ProfileEdit(UserPassesTestMixin, LoginRequiredMixin, UpdateView):
model = User
form_class = ProfileForm
template_name="profile/profile_new.html"
def test_func(self):
x = self.request.user.username
y = self.kwargs['slug']
if x == y:
return True
else:
if self.request.user.is_authenticated():
raise Http404("You are not authenticated to edit this profile")
我更换了#id; id&#39;与&#39; slug&#39;我将用它来编辑