我正在开发一个需要两种类型用户的Intranet Web应用程序。可以从django admin和特定类型的用户设置的普通用户 - 员工。
我有Employee类型用户的以下模型。
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
创建。我如何处理这种情况?
答案 0 :(得分:0)
我使用基于此article启发的AbstractUser
的自定义用户实现了这一目标。
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',)