19

こんにちは、python と django の初心者です。現在のユーザー プロファイルを取得するビューが必要です。User から get_profile を使用する必要があることはわかっていますが、使用方法がわかりません。私はdjangoのドキュメントを読みましたが、役に立ちませんでした。これは私がdocから見つけたものです:

from django.contrib.auth.models import User
profile=request.user.get_profile()
4

4 に答える 4

46

Django のドキュメントには、特にユーザーに関する追加情報を保存する部分がすべて記載されています。models.py最初に、ユーザーの追加情報のために with フィールドのどこかにモデルを定義する必要があります。

models.py

from django.contrib.auth.models import User

class UserProfile(models.Model):
    # This field is required.
    user = models.OneToOneField(User)

    # Other fields here
    accepted_eula = models.BooleanField()
    favorite_animal = models.CharField(max_length=20, default="Dragons.")

UserProfile次に、 内で次のように設定して、このモデル ( ) がユーザー プロファイルであることを示す必要がありAUTH_PROFILE_MODULEますsettings.py

設定.py

...
AUTH_PROFILE_MODULE = 'accounts.UserProfile'
...

accountsアプリの名前に置き換える必要があります。最後に、ハンドラーUserを登録してインスタンスが作成されるたびにプロファイルを作成する必要がありpost_saveます。この方法では、ユーザーを作成するたびに Django もプロファイルを作成します。

models.py

from django.contrib.auth.models import User

class UserProfile(models.Model):
    # This field is required.
    user = models.OneToOneField(User)

    # Other fields here
    accepted_eula = models.BooleanField()
    favorite_animal = models.CharField(max_length=20, default="Dragons.")


def create_user_profile(sender, instance, created, **kwargs):
    if created:
        UserProfile.objects.create(user=instance)

post_save.connect(create_user_profile, sender=User)

プロファイルへのアクセス

ビューで現在のユーザーのプロファイルにアクセスするにはUser、リクエストによって提供されたインスタンスを使用し、その上でget_profileを呼び出します。

def your_view(request):
    profile = request.user.get_profile()
    ...
    # Your code
于 2012-11-19T19:34:10.867 に答える
6

基本的に、djangoユーザーモデルはフィールド(名、姓、メール、パスワード、is_staff、is_active、last_login)にのみアクセスを提供します。

ただし、このモデルにフィールドを追加する場合、たとえば、すべてのユーザーにdateofbirthという名前の新しい列を追加する必要がある場合は、DOBという名前の列をユーザーモデルに追加する必要があります。ただし、djangoユーザーモデルを編集できないため、これは不可能です。

これを達成するには

1.ユーザーモデルの列が新しいテーブルの列にマップされるように、電子メールIDとDOB列を持つ別の新しいテーブルを作成できます。ただし、これにより、dbリクエストごとに新しいdbインスタンスが作成されます。顧客の生年月日を見つけたい場合は、次のように言います。

  • まず、Userテーブルから顧客のマップされたIDの値をフェッチする必要があります。
  • 上記の値を使用して、新しいテーブルからDOBを取得します。

2番目の方法では、

djangoユーザーモデルを使用する代わりに、必要なすべてのフィールドを備えた独自のカスタマイズモデルを使用してください。ただし、セキュリティに関連する更新やdjangoユーザーモデルの拡張が行われた場合、それを直接使用することはできません。最後に(カスタマイズモデルを使用する場合は常に)コードをさらに変更する必要があります。これは、開発者がコードを特定して変更を加えるのに少し苦労します。

上記の問題を克服するために、djangoは非常にシンプルで柔軟性のあるdjangoプロファイルを導入しています。利点は次のとおりです

  • ユーザーモデルの更新/拡張は、コードをあまり変更せずに適用できます
  • 追加の値をフェッチするために新しいdbインスタンスを作成する必要はありません。
  • フィールドには1対1のマッピングがあるため、1つのテーブルからデータを削除すると、他のテーブルも削除されます。
  • djangoモデルを使用しているため(SQLインジェクションなし)、より安全です

これを使用する方法:

settings.pyで、変数AUTH_PROFILE_MODULE= "appname.profiletable"を作成します

  • models.pyで、必要なフィールドを使用して新しいテーブルを作成し、ユーザーモデルのIDが新しいテーブルと1対1でマップされていることを確認します。
  • ユーザーモデルに新しいエントリが追加されるたびに、新しいテーブルに行を挿入するシグナルを作成します。
  • 新しいテーブルの値には、Userオブジェクト自体を使用してアクセスできます。

たとえば、DOB、emailidを持つ新しいテーブルエクストラユーザーを作成しました。顧客の生年月日を見つけるには、

a=User.objects.get(email='x@x.xom')
a.get_profile().DOB will give the dateofbirth value from extrauser table.

上記の詳細が、djangoプロファイルを理解する上で明確になることを願っています。さらにサポートが必要な場合は、お知らせください。プロジェクトでdjangoプロファイルを使用しました。

于 2012-11-19T20:13:46.057 に答える
6

古い質問ですが、今日それを見ている人は誰でもこれから恩恵を受けるかもしれないと思いました:

Django 1.5 では、User モデルを簡単に拡張できる機能が追加されました。扱うオブジェクトが 2 つではなく 1 つになったので、これが望ましい場合があります。より現代的な方法のようです。

https://hurricanelabs.com/blog/django-user-models/

于 2014-01-25T04:17:50.993 に答える
2

設定により、どのクラスが「プロファイル」であるかを指定する必要がありますAUTH_PROFILE_MODULE = 'accounts.UserProfile'(例)

https://docs.djangoproject.com/en/1.4/topics/auth/

于 2012-11-19T19:29:59.947 に答える