これを実現するには、Django1.5の新しい構成可能なユーザーモデルを使用できます。ここでドキュメントを確認できます。
一般的な考え方を示すために、ユーザーモデルを拡張し、AbstractUser
フィールドを追加して、医師と患者の間にリンク関係を作成します。患者が1人の医師しか持てず、医師が多くの患者を持つことができる場合は、ForeignKey関係を使用します。患者が多くの医師を持つことができる場合は、多対多の関係を使用します。以下の私の例は、ForeignKeyを使用しています。
class PHRUser(AbstractUser):
phr_relate = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, blank=True)
token = models.EmailField(null=True, blank=True)
USER_CHOICES = (
('1', 'Doctor'),
('2', 'Patient')
)
user_type = models.CharField(choices=USER_CHOICES, max_length=10)
次に、登録で次のようなものを実装できます。
def UserRegistration(request):
if request.method == 'POST':
form = UserCreateForm(request.POST)
if form.is_valid():
data = request.POST.copy()
# if user that is registering is a doctor, token is their own email. otherwise their token is their doctor's email and
# their relation is their doctor
if data.__getitem__('user_type') == '1':
data.__setitem__('token', data.__getitem__('email'))
else:
doctor = PHRUser.objects.get(email=data.__getitem__('token'))
data.__setitem__('phr_relate', staker.id)
data.__setitem__('token', '')
new_user = form.save(data)
return HttpResponseRedirect('/')
次に、ビューで次のようなユーティリティ関数を実装できます。
def user_relation(request, owner):
if (request.user.email == owner.email) or (request.user.email == owner.token):
return True
レコードの所有者のユーザーオブジェクトをとして渡すowner
と、関数は次のようになります。
- ログインしたユーザーが医師であり、許可された患者の記録を表示しようとしている場合はTrueを返します
- ログインしたユーザーが患者であり、自分の記録を表示しようとしている場合はTrueを返します
- それ以外の場合はFalseを返します
この関数をチェックとして使用して、ビューでこのリクエストに対して何を表示する必要があるかを確認できます。
実装にこれを正しくするために、おそらくいじくり回す必要がありますが、これで始めることができます。