Django 使用UserProfile限制视图中的访问

Django 使用UserProfile限制视图中的访问,django,django-views,Django,Django Views,我有一个在html发布页面上显示客户端资产的应用程序。授权使用系统的每个客户都被分配了一个配置文件: class UserProfile(models.Model): user = models.ForeignKey(User, unique=True) fullname = models.CharField(max_length=64, unique=False) company = models.CharField(max_length=50, choices=C

我有一个在html发布页面上显示客户端资产的应用程序。授权使用系统的每个客户都被分配了一个配置文件:

class UserProfile(models.Model):  
    user = models.ForeignKey(User, unique=True)
    fullname = models.CharField(max_length=64, unique=False)
    company = models.CharField(max_length=50, choices=CLIENT_CHOICES)
    position = models.CharField(max_length=64, unique=False, blank=True, null=True)
    ...

    User.profile = property(lambda u: UserProfile.objects.get_or_create(user=u)[0])

    def __unicode__(self):
        return u'%s' % self.fullname

    class Meta:
        ordering = ['fullname']

    class Admin: 
        pass  
还有一个帖子页面的模型:

class PostPage(models.Model):
    client = models.CharField(max_length=50, choices=CLIENT_CHOICES)
    job_number = models.CharField(max_length=30, unique=True, blank=False, null=False)
    job_name = models.CharField(max_length=64, unique=False, blank=False, null=False)
    page_type = models.CharField(max_length=50, default='POST')
    create_date = models.DateField(("Date"), default=datetime.date.today)
    contact = models.ForeignKey(UserProfile)
    contact2 = models.ForeignKey(UserProfile, related_name='+', blank=True, null=True)
    contact3 = models.ForeignKey(UserProfile, related_name='+', blank=True, null=True)
    contact4 = models.ForeignKey(UserProfile, related_name='+', blank=True, null=True)

    def __unicode__ (self):
            return u'%s %s %s' % (self.client, self.job_number, self.job_name)

    class Admin: 
            pass
最后,一个非常简单的查看功能用于显示页面:

def display_postings(request, job_number):
        records = PostPage.objects.filter(job_number=job_number)
        tpl = 'post_page.html'
        return render_to_response(tpl, { 'records': records })
问题是,如果您为ACME公司工作并从ACME公司访问该系统,则视图中没有任何逻辑会阻止您查看BETAMAX公司的记录以及您自己的记录。我如何修改我的视图,以便如果user.profile.company=ACME,但请求返回一个PostPage.client=BETAMAX的记录,那么对该记录的访问将被拒绝?此外,我是否可以有一个公司组,例如user.profile.company=MY_company,它可以访问所有记录?

编写一个检查request.user所在公司的视图。代码如下所示:

def belongs_to_company(func):

    def decorator(request, *args, **kwargs):
        has_permissions = False
        # get current company
        ...

        # get user's list of company
        ...

        # if company not in user's list of company

        if not has_permissions:
            url = reverse('no_perms')
            return redirect(url)

        return func(request, *args, **kwargs)
    return decorator
一个更好的长期解决方案是像