Python 带有get_对象的UserPasseTestMixin的test_func不适用于ListView
在我的项目仪表板的“联系人”部分中,保存的联系人仅对作者可见,但以前每个人都可见,因为我忘记在CBV中包含Python 带有get_对象的UserPasseTestMixin的test_func不适用于ListView,python,django,django-class-based-views,Python,Django,Django Class Based Views,在我的项目仪表板的“联系人”部分中,保存的联系人仅对作者可见,但以前每个人都可见,因为我忘记在CBV中包含userpassestimixin。我包括但浏览器显示了名为NotImplemented test_func的错误,我还实现了test_func 视图.py class ContactListView(LoginRequiredMixin, UserPassesTestMixin, ListView): model = ClientContact template_name =
userpassestimixin
。我包括但浏览器显示了名为NotImplemented test_func的错误,我还实现了test_func
视图.py
class ContactListView(LoginRequiredMixin, UserPassesTestMixin, ListView):
model = ClientContact
template_name = 'site/contacts.html'
context_object_name = 'contacts'
ordering = ['created_at', '-updated_at']
def test_func(self):
contact = self.get_object()
if self.request.user == contact.author:
return True
return False
它再次指出,NotImplemented test_func以及get_Project在ListView中是一个未解析的引用
我肯定我做错了什么,但我找不到我的错误。如果有人知道这一点,请纠正我!谢谢
列表视图
用于显示多个对象,因此调用get_object()
(它用于单个对象的视图,如DetailView
)
列表视图的常用方法是覆盖get\u queryset
,并过滤queryset以仅显示该用户的对象
class ContactListView(LoginRequiredMixin, ListView):
model = ClientContact
template_name = 'site/contacts.html'
context_object_name = 'contacts'
ordering = ['created_at', '-updated_at']
def get_queryset(self):
return super(ContactListView, self).get_queryset().filter(author=self.request.user)
您已经有了LoginRequiredMixin
,它将处理用户未登录时的情况
如果要在多个列表视图中过滤查询集,可以编写一个mixin,例如:
class AuthorMixin(object):
def get_queryset(self):
return super(AuthorMixin, self).get_queryset().filter(author=self.request.user)
然后在您的视图中使用它:
class ContactListView(LoginRequiredMixin, AuthorMixin, ListView):
...
请注意,以上内容未经测试,它需要
LoginRequiredMixin
(因为它不处理匿名用户案例),并且仅当用户外键名为author
时才起作用。您可以改进mixin,但您可能更愿意重复get\u queryset
方法。当您询问有关错误的问题时,请显示完整的回溯-它可以让您更清楚地了解错误的来源。谢谢@Alasdair它终于起作用了。我要问几个问题,因为我对django的每一个对象都是新手,我应该写这个queryset还是将它粘贴到文件中并调用它?在我的项目中,在用户注册之后还有一个叫做“点击完成”的步骤,用户可以在这里完成他们的个人资料。当用户被创建时,它会重定向到dashborad,它会自动重拨配置文件完成页面。我延迟了这一操作,因为它花费了很多时间。这就是为什么如果你不介意的话,请告诉我关于这些的想法?如果你想在基于类的视图中重用代码,正确的方法是使用mixin。我在上面添加了一个简单的示例。你关于用户创建的问题听起来像是一个单独的问题,所以我不能帮你。