2017-09-11 33 views
0

我正在研究需要兩種類型用戶的Intranet Web應用程序。普通用戶,可以從django管理員和特定類型的用戶進行設置 - 員工。創建一個單獨的用戶類型

我有僱員類型用戶的以下模型。

class Employee(models.Model): 
    emp_name = models.CharField(max_length=500) 
    slug = models.SlugField(unique=True, default='') 
    location = models.CharField(max_length=200) 
    email = models.EmailField() 
    experience = models.TextField(blank=True) 
    primary_skill = models.ManyToManyField(PrimarySkill) 
    secondary_skill = models.ManyToManyField(SecondarySkill) 

我想有這樣的OneToOneField按照官方文檔和 this article

user = models.OneToOneField(User, blank=True, null=True, on_delete=models.CASCADE) 

@receiver(post_save, sender=User) 
def create_employee(sender, instance, created, **kwargs): 
    if created: 
     Employee.objects.create(user=instance) 


@receiver(post_save, sender=User) 
def save_employee(sender, instance, **kwargs): 
    instance.employee.save() 

我意識到,這是我想的正好相反。每次從管理員創建用戶 時,都會在 app_employee表中創建一個條目。

我想是這樣的:

  • 每次創建一個Employee時間,我需要創建User
  • 僱員可以使用單獨的註冊表單創建,說emp_signup

如何處理這個情況?

回答

0

我已經實現了這個使用基於AbstractUser的定製用戶的靈感來自article

class CustomUser(AbstractUser): 
    pass 

class Employee(CustomUser): 
    user = models.OneToOneField(settings.AUTH_USER_MODEL) 
    # other fields 

在settings.py,我然後添加以下重點:

AUTH_USER_MODEL = 'myapp.CustomUser' 

不管走到哪裏,我需要參考User類,我用get_user_model(),這將取代我們的自定義用戶,在觀點和形式如下:

views.py

from django.contrib.auth import get_user_model 

def user_profile(request): 
    User = get_user_model() 
    user = get_object_or_404(User, username=request.user.username) 
    return render(request, 'user/user_profile.html', { 
     'site_user': user 
    }) 

forms.py

class SignUpForm(UserCreationForm): 

    class Meta: 
     model = get_user_model() 
     fields = ('username', 'email', 'password1', 'password2',)