2016-07-04 11 views
0

先週Djangoの学習を始めました。最良の方法はAppを構築することだと思いました。私は今、私のテストでUser Authモジュールに悩まされています。誰かが私を助けてくれるかもしれません: 私はデータベース内の従業員をモデル化し、User Authモデルに入れたいので、モデルを構築して、いくつかのチェックの後にUserに追加したいと思います。 Djangoでのユーザー認証

class Employee(models.Model): 

session = models.ForeignKey(
    'sessions.Session', 
    verbose_name='Session', 
    blank=True, null=True, 
) 
email = models.CharField(max_length=255) 
password1 = forms.CharField(max_length=30, widget=forms.PasswordInput()) #render_value=False 
password2 = forms.CharField(max_length=30, widget=forms.PasswordInput()) 
first_name = models.CharField(max_length=255) 
last_name = models.CharField(max_length=255) 
region = models.ForeignKey(Region, on_delete=models.CASCADE) 
workgroup = models.ForeignKey(Workgroups, on_delete=models.CASCADE) 
user_since = models.DateTimeField('Signed up since', default=timezone.now()) 
rights = models.IntegerField(default=0) 

def __str__(self): 
    return self.email 

def clean_username(self): # check if username dos not exist before 
    try: 
     User.objects.get(username=self.cleaned_data['email']) #get user from user model 
    except User.DoesNotExist : 
     return self.cleaned_data['email'] 

    raise ValidationError("this user exist already") 

def clean(self): # check if password 1 and password2 match each other 
    if 'password1' in self.cleaned_data and 'password2' in self.cleaned_data:#check if both pass first validation 
     if self.cleaned_data['password1'] != self.cleaned_data['password2']: # check if they match each other 
      raise ValidationError("passwords dont match each other") 

    return self.cleaned_data 

def dosave(self): # create new user 
    new_user=User.objects.create_user(self.cleaned_data['username'], 
           self.cleaned_data['email'], 
           self.cleaned_data['password1']) 
    new_user.save() 
    return new_user 

だから、次の私は、次のようにいくつかのテスト、そのうちの一つを書いた:私はこのテストを実行すると

myuser = Employee.objects.create(first_name='Annie', 
            last_name='Levers', email='[email protected]', 
            region=mymun, workgroup=mygroup, user_since=timezone.now()) 
    self.assertEquals(
     str(myuser), 
     '[email protected]', 
    ) 

    # Check user.auth db 
    userpk = myuser.id 
    user = get_object_or_404(User, pk=userpk) 
    user.set_password('abcxyz123') 
    user.save() 

は、Pythonはユーザーでuserpkのエントリを見つけることができませんが、私に404を与えますオブジェクト。

アイデア?ありがとうございました!

答えて

1

カスタムユーザーモデルを作成する場合は、AbstractBaseUserを使用する必要があります。

https://docs.djangoproject.com/es/1.9/topics/auth/customizing/#specifying-a-custom-user-model

+0

@Becherこれです。 authのた​​めに使用されるモデルは 'AbstractBaseUser'を拡張しなければなりません。さもなければ、あなたは多くのカスタムコードとソースを介して掘り下げています。 – frnhr