2009-05-22 5 views
11

デフォルトのDjangoのUserモデルには、私が本当に必要としないいくつかのフィールドと検証規則があります。できるだけシンプルに登録したい、つまりメールやユーザー名、電話番号のいずれかが必要です。これらはすべて固有のものであり、したがってユーザー識別子として適しています。私のニーズに合わせてデフォルトのdjangoユーザーモデルを変更するには?

また、Djangoユーザーモデルで検証されたユーザー名の既定の文字セットが嫌いです。私はそこに任意の文字を許可したいと思います - なぜですか?

ユーザープロファイルを追加する前にユーザープロファイルdjangoアプリケーションを使用しましたが、今回はクラスを最小限にすることにしました。しかし、私はまだUserクラスを使いたいと思っています。ログインしたユーザーだけがサイトの一部を制限する簡単な方法を提供します。

どうすればいいですか?

答えて

8

Userクラスを直接変更するか、サブクラス化するのではなく、既存のフィールドを再利用することもできます。

1つのサイトでは、ユーザーの「公開された名前」として「first_name」フィールドを使用し、そのユーザーの「ユーザー名」フィールド(URLで使用するため)にその情報の刻々としたバージョンを埋め込みました。私は人々が "公開名"または電子メールアドレスを使用してログインできるカスタム認証バックエンドを作成し、登録時にそれらの両方の一意性を強制します。これは他の再利用可能なアプリとうまく連携し、追加のテーブルやクエリを導入しません。

別のサイトでは、ユーザー名はまったく欲しかったのですが、ユニークなメールです。 Djangoのユニークなユーザー名の必要性を満たすために、私は電子メールアドレスをハッシュしてユーザー名として使用しました(ハッシュを30文字以下に圧縮するためにbase64エンコードする必要があります)。電子メールでログインできるカスタム認証バックエンド。

下位互換性に問題がなければ、django.contrib.authとUserモデルをもっと柔軟にするために、これまでに多くの改良が加えられています。しかし、現在の制約の中で少し創造性を持って行うことができます。

+0

電子メールでログインするためにauthバックエンドを構築する方法はありますか? – kender

+0

このスニペットをチェックして始めましょう。http://www.djangosnippets.org/snippets/74/ 2番目のコメントのコードがスニペットのコードよりも優れているので、コメントを必ず読んでください。あなたが念頭に置いておきたいコメントには、他の関連する問題が提起されています。 –

7

Djangoユーザーモデルは非常に賢明に構成されています。たとえば、ユーザー名に任意の文字を許可したくない場合や、email address loginを達成する方法があり、ベースモデルの変更をハッキングしないでください。

ユーザーアカウントの周りに追加情報を保存するだけで、Djangoはユーザープロファイルの概念をサポートします。これを処理するための組み込みのサポートに頼る必要はありませんが、それは一般的に行われているコンベンションであり、エーテルの中に浮遊している再利用可能なDjangoアプリケーションでうまくプレイできるようになります。詳細については、hereを参照してください。

Core Userモデルを実際に修正したいだけでなく、再利用可能なアプリを使用して「再生してみよう」場合は、Pandora's Boxを少し開きます。開発者は、コアライブラリがどのように構造化されているかについて基本的な前提を設定しているため、変更によって予期しない破損が生じる可能性があります。それにもかかわらず、ベースモデルへの変更をモンキーにしたり、Djangoのコピーをローカルに分岐することができます。私は後者を落胆させ、あなたが何をやっているか知っていれば前者だけを推奨します。

+6

Djangoのユーザーモデルは、サイトを構築している場合、特定のニーズに合った合理的なユーザーモデルとなるという点で「分かりやすく」構成されています。しかし、フレームワークの中心的なユーザー抽象化として、いくつかの柔軟性が求められます。 –

+2

プラグイン可能な認証システムが望ましいと私は同意します –

7

質問が間違っています。この投稿が他の誰にも役立つことを願っています。

#in models.py 
from django.db.models.signals import post_save 

class UserProfile(models.Model): 
    user = models.ForeignKey(User) 
    #other fields here 

    def __str__(self): 
      return "%s's profile" % self.user 

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

post_save.connect(create_user_profile, sender=User) 

#in settings.py 
AUTH_PROFILE_MODULE = 'YOURAPP.UserProfile' 

これはUSERPROFILEにそれが作成されている場合、ユーザーが保存されるたびに作成されます。 その後、ドキュメント

http://docs.djangoproject.com/en/dev/topics/auth/#storing-additional-information-about-users

0

からいくつかのより多くの情報であるプロファイルを避けることにコミットしている場合は、実際には2つのソリューションを持っているジレンマのビットに直面している。ここ

user.get_profile().whatever 

を使用することができますベースのカスタマイズは既に指摘しています。

  1. 変更ダニエルの提案
  2. あたりUserモデル自体は、Userをサブクラスまたはその機能をコピー、CustomUserクラスを記述します。

後者の提案は、あなたが手動で自動的にUserないこといくつかのことを実施しなければならないことを意味し、私はそれはあなたのプロジェクトの最初にしている場合は特に、それは思ったほど悪いのだろうか。あなたはミドルウェアクラスといくつかのデコレータを書き直すだけです。

もちろん、私はあなたのプロジェクトがあなたのdjango svn updateであれば壊れてはならないことを除いて、1つはあなたが手に入れないものを購入するとは思わない。それは他のアプリとの互換性の問題のいくつかを避けるかもしれませんが、私の推測ではほとんどの問題はいずれかの方法で存在するでしょう。

0

これを行うにはいくつかの方法がありますが、私がやることは次のとおりです。ユーザーに電子メール、ユーザー名(少なくとも1文字は含まれていなければならず、@記号を含む必要があります)次に、私がそれを検証するとき:

  1. @の存在をチェックしてください。そうであれば、それをユーザの電子メールとして設定し、適切にハッシュし、ユーザ名としても設定します。
  2. 番号、ダッシュ、および+のみを確認してください。次に、適切な文字を削除し、携帯電話番号とユーザー名の両方として保存します(SMS目的などのために携帯電話番号を別のモデルに保存する場合)。
  3. どちらでもない場合は、usernameとして設定してください。

また、ログイン時にユーザー/電話/メールのフィールドも同様に検証し、適切な場所を調べると、ユーザーが携帯電話番号にサインアップしてからユーザー名を変更すると目的)、彼らはまだ彼らの携帯電話番号でサインインすることができます。

関連する問題