【问题标题】:Django filter ListView by userDjango按用户过滤ListView
【发布时间】:2016-03-17 05:29:30
【问题描述】:

我的视图中有@required_login 装饰器,但我需要我的ListView 来仅显示与当前登录用户相关的对象。

我正在尝试:

class NdaList(ListView):
    form_class = NonDisclosureForm
    template_name = 'nda/nda_list.html'

    def get_queryset(self):
        return NonDisclosure.objects.filter(user=self.request.user)

但它给了我一个Cannot query "charles": Must be "Profile" instance.

我的模型:

class Profile(models.Model):
    user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.PROTECT, related_name="profile", verbose_name="user")
...

class NonDisclosure(Timestamp):
    user = models.ForeignKey(Profile, on_delete=models.CASCADE, related_name="nda", verbose_name="user")
...

我已经尽我所能尝试了,但由于我对 Django 的了解仍然有限,我没有想法。感谢您的宝贵时间。

【问题讨论】:

  • 发布您的 settings.py 文件

标签: django django-models django-forms django-templates django-views


【解决方案1】:

快速解决方案:

        return NonDisclosure.objects.filter(user__user=self.request.user)

补充:

我认为最好更改NonDisclosure 中的user 字段名称,因为实际上该字段指向Profile 实例而不是User

class NonDisclosure(Timestamp):
    profile = models.ForeignKey(Profile, on_delete=models.CASCADE, related_name="nda", verbose_name="user")

您的查询语句也更改为:

return NonDisclosure.objects.filter(profile__user=self.request.user)

【讨论】:

  • 但用户类型为settings.AUTH_USER_MODEL
  • @AvinashRaj AUTH_USER_MODEL 也是一个类似用户的模型。毕竟,额外的部分只是为了避免误导。
  • 是的,你必须传递 AUTH_USER_MODEL 的实例而不是字符串。
  • 感谢你们花时间讨论这个......我不敢相信我在这上面浪费了多少时间 :) 将我的 NonDisclosure user 更改为也很有意义Profile - 因为用户设置在Profile。谢谢你的建议。
猜你喜欢
  • 2018-05-10
  • 2016-11-23
  • 2014-01-31
  • 2015-08-15
  • 2021-04-07
  • 1970-01-01
  • 2012-03-23
  • 1970-01-01
  • 2012-07-07
相关资源
最近更新 更多