0

私はDjangoに少し慣れていないので、中規模のプロジェクトに関するアドバイスを探しています。私たちの社内管理者は1つのことですが、ユーザーはオンラインでログインして、同様の(より制限されていますが、ほとんど同じ)インターフェイスを表示することもできます。

問題は、ユーザーの電子メールがユーザー名であり、電子メールが一意である必要はないということです(ただし、理解できる理由から、パスワードは一意である必要があります)。ゲットー?はい。しかし、それは彼らが期待していることです。

この2番目のインターフェイスを作成したり、サインイン用の従来のユーザー名から逸脱したりすることは可能ですか?Django 1.5sカスタムユーザーモデルはここで私のために何かをしますか?また、管理者用とユーザー用の2つのユーザーモデルを利用することは可能ですか?

そして最後に、私が完全に間違った方向に向かっている場合は、私に知らせてください。これは私が以前に尋ねた質問のフォローアップですが、詳細のいくつかを忘れていました。

編集:私はそれをするのが嫌いですが、メンバー領域を個別にコーディングします。ログインの奇妙さが増しているので、あまり乾燥していなくても、これが最も簡単な解決策になると思います。

4

2 に答える 2

1
  1. 2つの管理インターフェースを持つことはおそらくばかげています。Djangoの管理者は、堅牢なユーザー権限をサポートしています。

  2. ユーザー名を一意に保ち、メール認証バックエンドを使用します。これにより、ユーザーは必要に応じて自分の電子メールアドレスを使用できます。少なくとも1.4では、電子メールアドレスは一意である必要はなかったので、明確になります。

  3. 簡単なメール認証バックエンドは次のとおりです。

    from django.contrib.auth.backends import ModelBackend
    from django.contrib.admin.models import User
    
    class EmailAuthBackEnd(ModelBackend):
        def authenticate(self, email=None, password=None,**kwargs):
            try:
                user = User.objects.get(email=email)  
                if user.check_password(password):
                    return user
                return None
            except User.DoesNotExist:
                return None
    
  4. 上記をアプリの1つにあるbackends.pyというファイルに追加してから、settings.pyに追加します。

    AUTHENTICATION_BACKENDS = AUTHENTICATION_BACKENDS + ('app.backends.EmailAuthBackEnd',)
    
  5. 全体として、一意のパスワードのこと…それを処理するのは難しいです。Djangoのユーザーモデルをサブクラス化し、パスワードを一意の文字列に変更するか、PSQLに手動でパッチを適用してその制約を適用することができます。または、怠惰で、パスワードが割り当てられると想定し、すべてのユーザーにランダムなユーザー名を割り当てます。いつでもログインして問題のあるアカウントを「修正」できることを知っていれば安全です。

于 2013-02-27T08:44:26.263 に答える
0

ユーザーが現在の資格情報を保持できるようにして(ユーザビリティの観点からは大きなプラスになります)、ユーザーがどこから来ているかに応じて表示内容を調整することをお勧めします。djangoのModelAdminには、オーバーライドできるメソッドがたくさんあります。したがって、モデルごとに行うことができます-

class MyModelAdmin(admin.ModelAdmin):
    def get_form(self, request, obj=None, **kwargs):
        self.exclude = []
        if request.META(REMOTE_ADDR) not in [# add list of internal ip's here]
            self.exclude.append('field_to_hide')
        return super(MyModelAdmin, self).get_form(request, obj, **kwargs)

ここのドキュメントの例のように。(また、ここでhttpヘッダーのリストを見て、チェックを行う方法を理解してください)

メインの管理メニューで使用可能なオブジェクトのリストを変更する場合は、AdminSiteget_urls()のオーバーライドを確認して、上記で提案した個々のメソッドと同様の機能を提供する独自のメソッドを追加しますget_form

于 2013-02-27T09:02:17.763 に答える