0

私はdjangoを初めて使用し、この分野での経験は非常に限られているので、あなたが私を助けてくれると思いました。

私はPatientHealthRecord(PHR)システムを構築しようとしています。ここでは、UserクラスのインスタンスであるOwnerとDoctorの2つのタイプのユーザーがいます。医師がログインし、ユーザーが自分のクレデンシャルを入力して、医師が自分のPHRにエントリを追加できるようにするアプリを作成したいと思います。

認証用のモデルとビューを使用したデュアルロギングの部分を手伝っていただければ幸いです。

4

1 に答える 1

1

これを実現するには、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を返します

この関数をチェックとして使用して、ビューでこのリクエストに対して何を表示する必要があるかを確認できます。

実装にこれを正しくするために、おそらくいじくり回す必要がありますが、これで始めることができます。

于 2013-02-28T19:48:54.140 に答える