Django 用户管理:如何避免每个用户看到其他用户的内容和数据?

Giu*_*lia 0 python django django-users

在我的小型 Django 项目中,用户可以注册并通过填写一些 ModelForms 来使用他们自己的数据填充现有模型。

问题是,登录后,任何用户不仅可以看到自己的数据,还可以看到其他用户创建的数据。我需要避免这种情况。
每个用户都应该能够查看、修改和与他们自己的数据进行交互。

每个模型都有一个ForeignKey链接到User.
我可能在视图中遗漏了什么吗?
它们只是不引用的基于类的视图User,它们只有LoginRequiredMixin装饰器。

对于登录视图,我使用的是 Django 标准,对于注册视图,我创建了一个UserFormView.

# Register page
url(r'^register/$', views.UserFormView.as_view(), name='register'),

# Login page
url(r'^accounts/login/$', auth_views.LoginView.as_view(), name='login'),
Run Code Online (Sandbox Code Playgroud)

以下是我的看法:

class AllProgramsView (LoginRequiredMixin, generic.ListView):
    template_name = 'programs/index.html'
    context_object_name = 'programs_list'

    def get_queryset(self):
        return Program.objects.all()

class ProgramDetailView (LoginRequiredMixin, generic.DetailView):
    model = Program
    template_name = 'programs/program.html'

class ProgramCreate(LoginRequiredMixin, CreateView):
    model = Program
    form_class = ProgramFormClass

class ProgramUpdate(LoginRequiredMixin, UpdateView):
    model = Program
    form_class = ProgramFormClass
Run Code Online (Sandbox Code Playgroud)

models.py

class Program(models.Model):
    program_name = models.CharField(max_length=50)
    program_description = models.CharField(max_length=250)
    is_favourite = models.BooleanField(default="False")
    user = models.ForeignKey(User, on_delete=models.CASCADE)

    def get_absolute_url(self):
        return reverse('programs:program', kwargs={'pk': self.pk})

    def __str__(self):
        return self.program_name
Run Code Online (Sandbox Code Playgroud)

是否有正确的程序可以实施以将每个用户与其他用户分开?

Raj*_*jez 5

You can get the current user, who is requesting the view and filter their records only as by the following

class AllProgramsView (LoginRequiredMixin, generic.ListView):
 template_name = 'programs/index.html'
 context_object_name = 'programs_list'

 def get_queryset(self):
    user = self.request.user
    queryset = Program.objects.filter(user=user)
    return queryset
Run Code Online (Sandbox Code Playgroud)