如何在Django中拥有3种类型的用户?

时间:2017-08-09 15:33:00

标签: python django

我正在开发一个支持Django的网站,其中我有三种类型的用户:

  • 教师:可以添加培训阶段优惠,
  • 学生:可以申请培训阶段,
  • 公司:还可以添加培训阶段优惠。

我的主要问题是如何在Django中拥有三种类型的用户,以便我可以有三种类型的登录?

我目前的解决方案是我有每种类型用户的三个模型(模型学生,模型教师,模型公司)。我还有三种不同的表格,允许公司,教师或学生注册。在我的视图中正确编译表单时,我手动(通过编码)创建用户,然后手动为相对模型创建对象,然后保存该对象。

主要问题是我创建的用户没有按类型区分:

class Azienda(models.Model):
nome=models.CharField(max_length=200)
sede=models.CharField(max_length=200)
pIva=models.CharField(max_length=30)
email = models.EmailField()
user = models.OneToOneField(User)
#company model, in models.py

#company form, in forms.py
class AziendaForm(forms.Form):
nome = forms.CharField(max_length=200)
sede = forms.CharField(max_length=200)
pIva = forms.CharField(max_length=30)
email = forms.EmailField()
user = forms.CharField(max_length=100)
password = forms.CharField(widget=forms.PasswordInput)

#view of company registration form
def registratiAziende(request):
if request.method=='POST':
    form=AziendaForm(request.POST)
    if form.is_valid():
        form['nome'].value()
        azienda=Azienda()
        azienda.nome=form['nome'].value()
        azienda.sede = form['sede'].value()
        azienda.pIva = form['pIva'].value()
        azienda.email=form['email'].value()
        #I create a user         user=User.objects.create_user(form['user'].value(),form['email'].value(),form['password'].value())
        azienda.user=user
        azienda.save()
        #I save the company object
    return redirect('myapp:index')
else:
    form= AziendaForm()

return render(request, 'myapp/registratiAziende.html', {'form':form})

2 个答案:

答案 0 :(得分:0)

这三种类型的用户在您的系统中包含相似的属性但角色不同。

只需在模型中添加属性role,这样您就不需要维护三个模型。

答案 1 :(得分:0)

默认用户模型可以通过将此模型作为OneToOne字段添加到默认用户模型来扩展。但是,对于您的情况,您必须使用OneToOneField创建不同的模型作为自定义用户模型,然后在学生,教师和公司中使用此模型。

CHOICES = (('student', 'student'), ('teacher', 'teacher'), ('company', 'company'))
class CustomUser(models.Model):
    user = models.OneToOneField(User)
    user_type = models.CharField(max_length=30, choices=CHOICES)

然后,您可以在公司,学生,教师模型中使用此模型。

一个建议是不要为不同的模型使用公共字段。规范化数据库以删除冗余。

相关问题