5

PostgreSQL で Django1.4 を使用しています。私は、学生と会社の 2 つのモデルを持つアプリケーションを開発しています。

class students(models.Model):

    first_name = models.CharField(**option)
    last_name = models.CharField(**option)
    username = models.EmailField(max_length=100, unique=True)
    password = models.CharField(_('password'), max_length=128)
    # Some other attributes for Student models



class company(models.Model):
    compnay_name = models.CharField(**option)
    username = models.EmailField(max_length=100, unique=True)
    password = models.CharField(_('password'), max_length=128)
    #Some other attributes for company models

私の要件:

  1. 学生と企業は新しいプロファイルを作成できます (サインアップ フォームを提供)
  2. 学生/会社、ユーザー名、つまり電子メールIDの新しいプロファイルを作成するのは一意である必要があります。つまり、電子メール ID は Student & Company モデルに存在してはなりません (タスクが完了しました)。
  3. 学生と企業のログイン用に 2 つのサインイン フォームを作成しました。

問題:

  1. ユーザーモデルを使用または拡張していないため、django 組み込みのログインと認証方法を使用できません。

  2. 学生/会社のユーザー名とパスワードでユーザー資格情報をチェックするカスタム認証方法を作成するにはどうすればよいですか? (学生用と企業用の 2 つの異なるサインイン フォームがあります)

私を助けてください。

私の質問を読んでくれてありがとう。

backend.py

class LoginBackend:
    def authenticate(self, username=None, password=None, model=None):
        if model == "Student":
            lookup_model = Student
        elif model == "Employer":
            lookup_model = Employer
        try:
            user = lookup_model.objects.get(email=username)
         except Exception, e:
            return None
    return user

ビュー.py

def check_auth(request):
    user_object = Student.objects.get(email__iexact = unicode(email))
    if check_password(password, user_object.password):
        print authenticate(username = email, password = password, model = "Student")
        login(request, user_object)

設定.py

AUTHENTICATION_BACKENDS = ("proj.app.backends.LoginBackend",)

エラー

/xxx/login/ での AttributeError

「学生」オブジェクトには属性「バックエンド」がありません

4

1 に答える 1

7

カスタム認証バックエンドを作成します。これを読む:

[アップデート]

カスタム認証バックエンドを作成して登録することで、標準の Django 認証パターンを使用するだけで済みます。あなたのサンプル コードを見て、私はあなたがそれを別様に理解しているという印象を受けました。

電子メールはあなたの一意のキーであるため、ログイン キーに電子メールを使用することをお勧めします。最初にログイン/パスワードを Student に対してチェックし、失敗した場合は Company に対してチェックします。

from django.contrib.auth.models import User
class JayapalsBackend(object):
    def authenticate(self, username=None, password=None):
         try:
             o = Student.objects.get(email=username, password=password)
         except Student.DoesNotExist:
             try:
                 o = Company.objects.get(email=username, password=password)
             except Company.DoesNotExist:
                 return None
         return User.objects.get(email=o.email)
    def get_user(self, user_id):
        try:
            return User.objects.get(pk=user_id)
        except User.DoesNotExist:
            return None

次に、標準の Django デコレータを使用します。

@login_required
def some_private_view(request):
    ...
于 2012-08-06T06:04:06.273 に答える