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」社で働いていて、そのシステムにアクセスする場合、自分のレコードに加えて「BETAMAX」社のレコードを表示できないようにするロジックがビューにないことです。user.profile.company = "ACME" のようにビューを変更するにはどうすればよいですか? しかし、リクエストが PostPage.client = "BETAMAX" のレコードを返し、レコードへのアクセスが拒否されますか? さらに、すべてのレコードにアクセスできる user.profile.company = "MY_COMPANY" など、1 つの会社グループを作成できますか?