Charles Smith
Charles Smith

Reputation: 3289

Django filter ListView by user

I have @required_login decorator in my views, but I need my ListView to show only objects related to the currently logged in user.

I am trying:

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

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

but it gives me a Cannot query "charles": Must be "Profile" instance.

My models:

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")
...

I have tried everything I can, but with my still limited knowledge of Django, I am out of ideas. Thank you for your time.

Upvotes: 1

Views: 1109

Answers (1)

soooooot
soooooot

Reputation: 1749

quick solution:

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

additional:

I think it's better to change the user field name in NonDisclosure, since actually the field is point to a Profile instance instead of User.

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

and also your query statement change to:

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

Upvotes: 3

Related Questions